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.
zabbix/ui/tests/integration/testUserParametersReload.php

264 lines
7.0 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/CIntegrationTest.php';
/**
* Test suite for user parameters reload
*
* @required-components server, agent, agent2
* @configurationDataProvider configurationProvider
* @backup items, history_str
* @hosts agentd, agent2
*/
class testUserParametersReload extends CIntegrationTest {
const USER_PARAM_RELOAD_DELAY = 10;
const ITEM_NAME_01 = 'usrprm01';
const ITEM_NAME_02 = 'usrprm02';
private static $hostids = [];
private static $itemids = [];
// List of items to check.
private static $items = [
[
'key' => self::ITEM_NAME_01,
'component' => self::COMPONENT_AGENT
],
[
'key' => self::ITEM_NAME_02,
'component' => self::COMPONENT_AGENT
],
[
'key' => self::ITEM_NAME_01,
'component' => self::COMPONENT_AGENT2
],
[
'key' => self::ITEM_NAME_02,
'component' => self::COMPONENT_AGENT2
]
];
/**
* @inheritdoc
*/
public function prepareData() {
// Create host "agentd" and "agent2".
$hosts = [];
foreach ([self::COMPONENT_AGENT => self::AGENT_PORT_SUFFIX, self::COMPONENT_AGENT2 => self::AGENT2_PORT_SUFFIX] as $component => $port) {
$hosts[] = [
'host' => $component,
'interfaces' => [
[
'type' => 1,
'main' => 1,
'useip' => 1,
'ip' => '127.0.0.1',
'dns' => '',
'port' => PHPUNIT_PORT_PREFIX.$port
]
],
'groups' => [
[
'groupid' => 4
]
],
'status' => HOST_STATUS_NOT_MONITORED
];
}
$response = $this->call('host.create', $hosts);
$this->assertArrayHasKey('hostids', $response['result']);
foreach ([self::COMPONENT_AGENT, self::COMPONENT_AGENT2] as $i => $name) {
$this->assertArrayHasKey($i, $response['result']['hostids']);
self::$hostids[$name] = $response['result']['hostids'][$i];
}
// Get host interface ids.
$response = $this->call('host.get', [
'output' => ['host'],
'hostids' => array_values(self::$hostids),
'selectInterfaces' => ['interfaceid']
]);
$interfaceids = [];
foreach ($response['result'] as $host) {
$interfaceids[$host['host']] = $host['interfaces'][0]['interfaceid'];
}
// Create items.
$items = [];
foreach (self::$items as $item) {
$data = [
'name' => $item['key'],
'key_' => $item['key'],
'type' => ITEM_TYPE_ZABBIX,
'value_type' => ITEM_VALUE_TYPE_STR,
'delay' => '1s'
];
$items[] = array_merge($data, [
'hostid' => self::$hostids[$item['component']],
'interfaceid' => $interfaceids[$item['component']]
]);
}
$response = $this->call('item.create', $items);
$this->assertArrayHasKey('itemids', $response['result']);
$this->assertEquals(count($items), count($response['result']['itemids']));
// Get item IDs
$itemids = $response['result']['itemids'];
foreach (self::$items as $i => $value) {
$name = $value['key'];
self::$itemids[$value['component'].':'.$name] = $itemids[$i];
}
return true;
}
/**
* Component configuration provider.
*
* @return array
*/
public function configurationProvider() {
return [
self::COMPONENT_SERVER => [
'UnavailableDelay' => 5,
'UnreachableDelay' => 1
],
self::COMPONENT_AGENT => [
'Hostname' => self::COMPONENT_AGENT
],
self::COMPONENT_AGENT2 => [
'Hostname' => self::COMPONENT_AGENT2,
'Plugins.Uptime.Capacity' => '10'
]
];
}
/**
* Component configuration provider.
*
* @return array
*/
public function configurationProvider_singleParam() {
return [
self::COMPONENT_AGENT => [
'UserParameter' => self::ITEM_NAME_01.',echo singleParam.01'
],
self::COMPONENT_AGENT2 => [
'UserParameter' => self::ITEM_NAME_01.',echo singleParam.01'
]
];
}
/**
* Check reloaded user parameters (usrprm01 only)
*
* @configurationDataProvider configurationProvider_singleParam
*/
public function testUserParametersReload_singleParam() {
foreach ([self::COMPONENT_AGENT, self::COMPONENT_AGENT2] as $component) {
$this->checkItemState($component.':'.self::ITEM_NAME_01, ITEM_STATE_NORMAL, 'singleParam.01');
$this->checkItemState($component.':'.self::ITEM_NAME_02, ITEM_STATE_NOTSUPPORTED);
}
}
/**
* Component configuration provider.
*
* @return array
*/
public function configurationProvider_multipleParams() {
return [
self::COMPONENT_AGENT => [
'UserParameter' => [
self::ITEM_NAME_01.',echo multipleParams.01',
self::ITEM_NAME_02.',echo multipleParams.02'
]
],
self::COMPONENT_AGENT2 => [
'UserParameter' => [
self::ITEM_NAME_01.',echo multipleParams.01',
self::ITEM_NAME_02.',echo multipleParams.02'
]
]
];
}
/**
* Check reloaded user parameters (usrprm01 and usrprm01)
*
* @configurationDataProvider configurationProvider_multipleParams
*/
public function testUserParametersReload_multipleParams() {
foreach ([self::COMPONENT_AGENT, self::COMPONENT_AGENT2] as $component) {
$this->checkItemState($component.':'.self::ITEM_NAME_01, ITEM_STATE_NORMAL, 'multipleParams.01');
$this->checkItemState($component.':'.self::ITEM_NAME_02, ITEM_STATE_NORMAL, 'multipleParams.02');
}
}
/**
* Check reloaded user parameters (no user parameters)
*/
public function testUserParametersReload_noParams() {
foreach ([self::COMPONENT_AGENT, self::COMPONENT_AGENT2] as $component) {
$this->checkItemState($component.':'.self::ITEM_NAME_01, ITEM_STATE_NOTSUPPORTED);
$this->checkItemState($component.':'.self::ITEM_NAME_02, ITEM_STATE_NOTSUPPORTED);
}
}
/**
* Check item state.
*
* @param string $name
* @param int $state
* @param string $lastvalue
*/
public function checkItemState(string $name, int $state, string $lastvalue = null) {
$wait_iterations = 5;
$wait_iteration_delay = 1;
for ($r = 0; $r < $wait_iterations; $r++) {
$item = $this->call('item.get', [
'output' => ['state', 'lastvalue'],
'itemids' => self::$itemids[$name]
])['result'][0];
if ($item['state'] == $state && ($state == ITEM_STATE_NOTSUPPORTED || $lastvalue === $item['lastvalue'])) {
break;
}
sleep($wait_iteration_delay);
}
$this->assertEquals($state, $item['state'], 'User parameter failed to reload, item name: '.$name);
if ($state == ITEM_STATE_NORMAL) {
$this->assertSame($lastvalue, $item['lastvalue'], 'User parameter failed to reload, item name: '.$name);
}
}
}