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.
340 lines
8.4 KiB
340 lines
8.4 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 __DIR__.'/../include/CAPITest.php';
|
|
require_once __DIR__.'/../../include/classes/helpers/CCuid.php';
|
|
|
|
/**
|
|
* @backup ha_node
|
|
*/
|
|
class testHaNode extends CAPITest {
|
|
|
|
public static function hanode_get_cases() {
|
|
return [
|
|
'No params' => [
|
|
'request' => [],
|
|
'expected_error' => null
|
|
],
|
|
'Too short ha_nodeid' => [
|
|
'request' => [
|
|
'ha_nodeids' => 'æų'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/ha_nodeids": an array is expected.'
|
|
],
|
|
'Integer ha_nodeids' => [
|
|
'request' => [
|
|
'ha_nodeids' => 7
|
|
],
|
|
'expected_error' => 'Invalid parameter "/ha_nodeids": an array is expected.'
|
|
],
|
|
'Empty ha_nodeids' => [
|
|
'request' => [
|
|
'ha_nodeids' => ''
|
|
],
|
|
'expected_error' => 'Invalid parameter "/ha_nodeids": an array is expected.'
|
|
],
|
|
'Null ha_nodeids' => [
|
|
'request' => [
|
|
'ha_nodeids' => null
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Unexpected param' => [
|
|
'request' => [
|
|
'flag' => true
|
|
],
|
|
'expected_error' => 'Invalid parameter "/": unexpected parameter "flag".'
|
|
],
|
|
'Non-existing status' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'status' => 111
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Empty filter' => [
|
|
'request' => [
|
|
'filter' => []
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Non-array filter' => [
|
|
'request' => [
|
|
'filter' => 1
|
|
],
|
|
'expected_error' => 'Invalid parameter "/filter": an array is expected.'
|
|
],
|
|
'Non-expected filter' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'unexpected' => 1
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/filter": unexpected parameter "unexpected".'
|
|
],
|
|
'Empty node name' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'name' => ['']
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Existing node by address' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'address' => ['192.168.1.9']
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Multiple nodes by address' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'address' => ['192.168.1.9', '192.168.1.10']
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Existing node by name' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'name' => 'node2'
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Multiple nodes by name' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'name' => ['node1', 'node3']
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Existing node by status' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'status' => ZBX_NODE_STATUS_STANDBY
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Existing nodes by status' => [
|
|
'request' => [
|
|
'filter' => [
|
|
'status' => [ZBX_NODE_STATUS_STOPPED, ZBX_NODE_STATUS_UNAVAILABLE]
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Limit param gets accepted' => [
|
|
'request' => [
|
|
'limit' => 1
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Limit should not be empty' => [
|
|
'request' => [
|
|
'limit' => ''
|
|
],
|
|
'expected_error' => 'Invalid parameter "/limit": an integer is expected.'
|
|
],
|
|
'Limit should not be string' => [
|
|
'request' => [
|
|
'limit' => 'abc'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/limit": an integer is expected.'
|
|
],
|
|
'Negative ha_nodeids' => [
|
|
'request' => [
|
|
'ha_nodeids' => [-1, -3]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/ha_nodeids/1": a character string is expected.'
|
|
],
|
|
'Too short ha_nodeids' => [
|
|
'request' => [
|
|
'ha_nodeids' => ['cuid', 'expected']
|
|
],
|
|
'expected_error' => 'Invalid parameter "/ha_nodeids/1": must be 25 characters long.'
|
|
],
|
|
'Non-cuid ha_nodeids' => [
|
|
'request' => [
|
|
'ha_nodeids' => [str_repeat('a', 25), str_repeat('b', 25)]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/ha_nodeids/1": CUID is expected.'
|
|
],
|
|
'Accepts output parameter' => [
|
|
'request' => [
|
|
'output' => API_OUTPUT_EXTEND
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Rejects empty output parameter' => [
|
|
'request' => [
|
|
'output' => ''
|
|
],
|
|
'expected_error' => 'Invalid parameter "/output": value must be "extend".'
|
|
],
|
|
'Accepts output as array' => [
|
|
'request' => [
|
|
'output' => ['name', 'lastaccess']
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Filters output fields' => [
|
|
'request' => [
|
|
'output' => ['name', 'status', 'unexpected_field']
|
|
],
|
|
'expected_error' => 'Invalid parameter "/output/3": value must be one of "ha_nodeid", "name", "address", "port", "lastaccess", "status".'
|
|
],
|
|
'Accepts preservekeys' => [
|
|
'request' => [
|
|
'preservekeys' => true
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Accepts sortfield' => [
|
|
'request' => [
|
|
'sortfield' => 'name'
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Rejects non-allowed sortfield' => [
|
|
'request' => [
|
|
'sortfield' => 'port'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/sortfield/1": value must be one of "name", "lastaccess", "status".'
|
|
],
|
|
'Accepts sortorder' => [
|
|
'request' => [
|
|
'sortfield' => 'name',
|
|
'sortorder' => 'DESC'
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Rejects non-ASC/DESC sortorder' => [
|
|
'request' => [
|
|
'sortfield' => 'name',
|
|
'sortorder' => 'RAND()'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/sortorder": value must be one of "ASC", "DESC".'
|
|
],
|
|
'Accepts countOutput' => [
|
|
'request' => [
|
|
'countOutput' => true
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Accepts countOutput as false' => [
|
|
'request' => [
|
|
'countOutput' => false
|
|
],
|
|
'expected_error' => null
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider hanode_get_cases
|
|
*/
|
|
public function testHaNode_get($request, $expected_error) {
|
|
$this->call('hanode.get', $request, $expected_error);
|
|
}
|
|
|
|
/**
|
|
* Verify technical fields like ha_sessionid are not returned, ha_nodeid can be excluded from result.
|
|
*/
|
|
public static function hanode_field_map() {
|
|
return [
|
|
'Check fields' => [
|
|
'request' => [
|
|
'ha_nodeids' => 'ckuo7i1nv000d0sajd95y1b6x',
|
|
'output' => 'extend'
|
|
],
|
|
'expected_result' => [
|
|
'ha_nodeid' => 'ckuo7i1nv000d0sajd95y1b6x',
|
|
'name' => 'node5',
|
|
'address' => '192.168.1.9',
|
|
'port' => '10053',
|
|
'status' => 1,
|
|
'ha_sessionid' => null
|
|
]
|
|
],
|
|
'Check absence of fields via output limitation, and sorting with limit' => [
|
|
'request' => [
|
|
'output' => ['name', 'address'],
|
|
'countOutput' => false,
|
|
'sortfield' => 'name',
|
|
'sortorder' => 'DESC',
|
|
'limit' => 1
|
|
],
|
|
'expected_result' => [
|
|
'ha_nodeid' => null,
|
|
'name' => 'z-node',
|
|
'address' => '192.168.1.12',
|
|
'port' => null,
|
|
'status' => null,
|
|
'ha_sessionid' => null
|
|
]
|
|
],
|
|
'Check countOutput' => [
|
|
'request' => [
|
|
'countOutput' => true
|
|
],
|
|
'expected_result' => 9
|
|
],
|
|
'Check countOutput with filter' => [
|
|
'request' => [
|
|
'filter' => ['status' => ZBX_NODE_STATUS_STOPPED],
|
|
'countOutput' => true
|
|
],
|
|
'expected_result' => 3
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider hanode_field_map
|
|
*/
|
|
public function testHaNode_FieldPresenceAndExclusion($params, $expected_result) {
|
|
$result = $this->call('hanode.get', $params);
|
|
|
|
if (!is_array($expected_result)) {
|
|
$this->assertEquals($result['result'], $expected_result, 'countCoutput rows should match');
|
|
return;
|
|
}
|
|
|
|
foreach ($result['result'] as $node) {
|
|
foreach ($expected_result as $field => $expected_value){
|
|
if ($expected_value === null) {
|
|
$this->assertArrayNotHasKey($field, $node, 'Field '.$field.' should not be present');
|
|
continue;
|
|
}
|
|
|
|
$this->assertArrayHasKey($field, $node, 'Field '.$field.' should be present.');
|
|
$this->assertEquals($node[$field], $expected_value, 'Returned value should match.');
|
|
}
|
|
}
|
|
}
|
|
}
|