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.

615 lines
16 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';
/**
* @onBefore prepareTestData
*
* @backup hstgrp
* @backup hosts
*/
class testTemplate extends CAPITest {
private static $data = [
'templateids' => [
'api_vendor_test' => null
]
];
public function prepareTestData() {
$templates_data = [
[
'host' => 'api_vendor_test',
'groups' => ['groupid' => 1],
'vendor_name' => 'Zabbix',
'vendor_version' => '6.4-0'
]
];
$templates = CDataHelper::call('template.create', $templates_data);
$this->assertArrayHasKey('templateids', $templates);
self::$data['templateids']['api_vendor_test'] = $templates['templateids'][0];
}
public function dataProviderCreate() {
return [
[
'request' => [
'host' => 'test-template-01',
'groups' => ['groupid' => 1]
]
],
[
'request' => [
'host' => 'test-template-02',
'groups' => []
],
'expected_error' => 'Invalid parameter "/1/groups": cannot be empty.'
],
[
'request' => [
'host' => 'test-template-03',
'groups' => [[]]
],
'expected_error' => 'Invalid parameter "/1/groups/1": the parameter "groupid" is missing.'
],
[
'request' => [
'host' => 'test-template-04',
'groups' => ['groupid' => 9999]
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'request' => [
'host' => 'test-template-05',
'groups' => ['groupid' => 1]
],
'expected_error' => 'No permissions to referred object or it does not exist!',
'user' => ['user' => 'zabbix-admin', 'password' => 'zabbix']
],
[
'request' => [
[
'host' => 'test-template-06',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-06',
'groups' => ['groupid' => 1]
]
],
'expected_error' => 'Invalid parameter "/2": value (host)=(test-template-06) already exists.'
],
[
'request' => [
[
'host' => 'test-template-07',
'name' => 'test-template-07',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-08',
'name' => 'test-template-07',
'groups' => ['groupid' => 1]
]
],
'expected_error' => 'Invalid parameter "/2": value (name)=(test-template-07) already exists.'
],
[
'request' => [
[
'host' => 'test-template-09',
'groups' => ['groupid' => 1]
]
]
],
// The next two test cases depends on the previous one.
[
'request' => [
[
'host' => 'test-template-09',
'groups' => ['groupid' => 1]
]
],
'expected_error' => 'Template with host name "test-template-09" already exists.'
],
[
'request' => [
[
'host' => 'test-template-10',
'name' => 'test-template-09',
'groups' => ['groupid' => 1]
]
],
'expected_error' => 'Template with visible name "test-template-09" already exists.'
],
// The next two test cases depends on the existing host "Zabbix server".
[
'request' => [
[
'host' => 'Zabbix server',
'groups' => ['groupid' => 1]
]
],
'expected_error' => 'Host with host name "Zabbix server" already exists.'
],
[
'request' => [
[
'host' => 'test-template-11',
'name' => 'Zabbix server',
'groups' => ['groupid' => 1]
]
],
'expected_error' => 'Host with visible name "Zabbix server" already exists.'
],
[
'request' => [
[
'host' => 'test-template-12',
'groups' => ['groupid' => 1],
'templates' => ['templateid' => 10047 /* "Zabbix server health" */]
]
]
],
[
'request' => [
[
'host' => 'test-template-13',
'groups' => ['groupid' => 1],
'templates' => ['templateid' => 99999]
]
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'request' => [
[
'host' => 'test-template-14',
'groups' => ['groupid' => 1],
'templates' => ['templateid' => 10047 /* "Zabbix server health" */]
]
],
'expected_error' => 'No permissions to referred object or it does not exist!',
'user' => ['user' => 'zabbix-admin', 'password' => 'zabbix']
],
[
'request' => [
[
'host' => 'vendor-template-error',
'groups' => ['groupid' => 1],
'vendor_name' => 'Zabbix'
]
],
'expected_error' => 'Invalid parameter "/1": both vendor_name and vendor_version should be either present or empty.'
],
[
'request' => [
[
'host' => 'vendor-template-error',
'groups' => ['groupid' => 1],
'vendor_name' => '',
'vendor_version' => '6.4-0'
]
],
'expected_error' => 'Invalid parameter "/1": both vendor_name and vendor_version should be either present or empty.'
]
];
}
public function dataProviderUpdate() {
return [
[
'request' => [
[
'templateid' => 'api_vendor_test',
'vendor_name' => '',
'vendor_version' => ''
]
]
],
[
'request' => [
[
'templateid' => 'api_vendor_test',
'vendor_name' => 'ZABBIX'
]
],
'expected_error' => 'Invalid parameter "/1": both vendor_name and vendor_version should be either present or empty.'
],
[
'request' => [
[
'templateid' => 'api_vendor_test',
'vendor_name' => 'Zabbix',
'vendor_version' => '6.4-0'
]
]
],
// The next two test cases depends on the previous one.
[
'request' => [
[
'templateid' => 'api_vendor_test',
'vendor_name' => 'ZABBIX'
]
]
],
[
'request' => [
[
'templateid' => 'api_vendor_test',
'vendor_version' => ''
]
],
'expected_error' => 'Invalid parameter "/1": both vendor_name and vendor_version should be either present or empty.'
]
];
}
/**
* @dataProvider dataProviderCreate
*/
public function testTemplate_Create(array $request, string $expected_error = null, array $user = null) {
if ($user !== null) {
$this->authorize($user['user'], $user['password']);
}
$this->call('template.create', $request, $expected_error);
}
public function testTemplate_CreateUUID() {
$result = $this->call('template.create', [
[
'host' => 'test-template-uuid-01',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-uuid-02',
'groups' => ['groupid' => 1]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$db_templates = $this->call('template.get', [
'output' => ['uuid'],
'templateids' => $result['templateids']
])['result'];
$this->assertTrue(preg_match('/[0-9a-f]{32}/', $db_templates[0]['uuid']) === 1);
$this->assertTrue(preg_match('/[0-9a-f]{32}/', $db_templates[1]['uuid']) === 1);
$this->assertNotSame($db_templates[0]['uuid'], $db_templates[1]['uuid']);
}
public function testTemplate_CreateDoubleLink() {
/* +-------------+
* | template-01 |
* +-------------+
* / \
* / \
* V |
* +-------------+ |
* | template-02 | |
* +-------------+ |
* | |
* V |
* +-------------+ |
* | template-03 | |
* +-------------+ |
* \ /
* \ /
* V V
* +-------------+ \
* | template-04 | | new template
* +-------------+ /
* fail
*/
$result = $this->call('template.create', [
[
'host' => 'test-template-double-link-01',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-double-link-02',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-double-link-03',
'groups' => ['groupid' => 1]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$templateids = $result['templateids'];
$result = $this->call('template.update', [
[
'templateid' => $templateids[1],
'templates' => ['templateid' => $templateids[0]]
],
[
'templateid' => $templateids[2],
'templates' => ['templateid' => $templateids[1]]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$this->call('template.create', [
[
'host' => 'test-template-double-link-04',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[0]],
['templateid' => $templateids[2]]
]
]
], 'Cannot link template "test-template-double-link-03" to template "test-template-double-link-04", because its parent template "test-template-double-link-01" would be linked twice.');
}
public function testTemplate_CreateTriggerDependency() {
/*
* +---------------------------+
* V | "trigger-02" depends on "trigger-01"
* +-------------+------------+ +-------------+------------+
* | template-01 | trigger-01 | | template-02 | trigger-02 |
* +-------------+------------+ +-------------+------------+
* |\ /|
* | \ +-------------+ / | \
* | \-->| template-03 |<---/ | |
* | +-------------+ | |
* V success V | new templates
* +-------------+ +-------------+ |
* | template-04 | | template-05 | |
* +-------------+ +-------------+ /
* success fail
*/
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-dependency-01',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-trigger-dependency-02',
'groups' => ['groupid' => 1]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$templateids = $result['templateids'];
$result = $this->call('item.create', [
[
'hostid' => $templateids[0],
'name' => 'item-01',
'key_' => 'item-01',
'type' => ITEM_TYPE_TRAPPER,
'value_type' => ITEM_VALUE_TYPE_FLOAT
],
[
'hostid' => $templateids[1],
'name' => 'item-02',
'key_' => 'item-02',
'type' => ITEM_TYPE_TRAPPER,
'value_type' => ITEM_VALUE_TYPE_FLOAT
]
])['result'];
$this->assertArrayHasKey('itemids', $result);
$result = $this->call('trigger.create', [
[
'description' => 'trigger-01',
'expression' => 'last(/test-template-trigger-dependency-01/item-01)'
],
[
'description' => 'trigger-02',
'expression' => 'last(/test-template-trigger-dependency-02/item-02)'
]
])['result'];
$this->assertArrayHasKey('triggerids', $result);
$triggerids = $result['triggerids'];
$result = $this->call('trigger.update', [
[
'triggerid' => $triggerids[1],
'dependencies' => [
['triggerid' => $triggerids[0]]
]
]
])['result'];
$this->assertArrayHasKey('triggerids', $result);
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-dependency-03',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[0]],
['templateid' => $templateids[1]]
]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-dependency-04',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[0]]
]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-dependency-05',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[1]]
]
]
], 'Cannot link template "test-template-trigger-dependency-02" without template "test-template-trigger-dependency-01" to template "test-template-trigger-dependency-05" due to dependency of trigger "trigger-02".');
}
public function testTemplate_CreateTriggerExpression() {
/*
* +-------------+---------+-------------+
* | template-01 | trigger | template-02 | The "trigger" contains items from both templates.
* +-------------+---------+-------------+
* |\ /|
* | \ +-------------+ / | \
* | \->| template-03 |<-/ | |
* | +-------------+ | |
* V success V | new templates
* +-------------+ +-------------+ |
* | template-04 | | template-05 | |
* +-------------+ +-------------+ /
* fail fail
*/
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-expression-01',
'groups' => ['groupid' => 1]
],
[
'host' => 'test-template-trigger-expression-02',
'groups' => ['groupid' => 1]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$templateids = $result['templateids'];
$result = $this->call('item.create', [
[
'hostid' => $templateids[0],
'name' => 'item-01',
'key_' => 'item-01',
'type' => ITEM_TYPE_TRAPPER,
'value_type' => ITEM_VALUE_TYPE_FLOAT
],
[
'hostid' => $templateids[1],
'name' => 'item-02',
'key_' => 'item-02',
'type' => ITEM_TYPE_TRAPPER,
'value_type' => ITEM_VALUE_TYPE_FLOAT
]
])['result'];
$this->assertArrayHasKey('itemids', $result);
$result = $this->call('trigger.create', [
[
'description' => 'trigger',
'expression' => 'last(/test-template-trigger-expression-01/item-01) or last(/test-template-trigger-expression-02/item-02)'
]
])['result'];
$this->assertArrayHasKey('triggerids', $result);
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-expression-03',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[0]],
['templateid' => $templateids[1]]
]
]
])['result'];
$this->assertArrayHasKey('templateids', $result);
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-expression-04',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[0]]
]
]
], 'Cannot link template "test-template-trigger-expression-01" without template "test-template-trigger-expression-02" to template "test-template-trigger-expression-04" due to expression of trigger "trigger".');
$result = $this->call('template.create', [
[
'host' => 'test-template-trigger-expression-05',
'groups' => ['groupid' => 1],
'templates' => [
['templateid' => $templateids[1]]
]
]
], 'Cannot link template "test-template-trigger-expression-02" without template "test-template-trigger-expression-01" to template "test-template-trigger-expression-05" due to expression of trigger "trigger".');
}
/**
* @dataProvider dataProviderUpdate
*/
public function testTemplate_Update(array $request, string $expected_error = null, array $user = null) {
if ($user !== null) {
$this->authorize($user['user'], $user['password']);
}
foreach ($request as &$request_item) {
$request_item['templateid'] = self::$data['templateids'][$request_item['templateid']];
}
unset($request_item);
$this->call('template.update', $request, $expected_error);
if ($expected_error === null) {
$fields = array_reduce($request, 'array_replace', []);
$db_templates = $this->call('template.get', [
'output' => array_keys($fields),
'templateids' => array_column($request, 'templateid'),
'preservekeys' => true
])['result'];
$templates = [];
foreach ($request as &$request_item) {
$templateid = $request_item['templateid'];
if (array_key_exists($templateid, $db_templates)) {
$templates[$templateid] = array_intersect_key($db_templates[$templateid], $request_item);
}
}
unset($request_item);
$this->assertEquals($templates, $db_templates);
}
}
}