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.
298 lines
9.4 KiB
298 lines
9.4 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__).'/../common/testSystemInformation.php';
|
||
|
require_once dirname(__FILE__).'/../behaviors/CMessageBehavior.php';
|
||
|
|
||
|
/**
|
||
|
* @backup dashboard, ha_node, config
|
||
|
*
|
||
|
* @backupConfig
|
||
|
*
|
||
|
* @onBefore prepareDashboardData
|
||
|
*/
|
||
|
class testDashboardSystemInformationWidget extends testSystemInformation {
|
||
|
|
||
|
public static $dashboardid; // Dashboard for checking widget content with enabled and disabled HA cluster.
|
||
|
public static $widgets_dashboardid; // Dashboard for checking creation and update of system information widgets.
|
||
|
|
||
|
/**
|
||
|
* Attach MessageBehavior to the test.
|
||
|
*/
|
||
|
public function getBehaviors() {
|
||
|
return [CMessageBehavior::class];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function creates dashboards with widgets for test and defines the corresponding dashboard IDs.
|
||
|
*/
|
||
|
public static function prepareDashboardData() {
|
||
|
$response = CDataHelper::call('dashboard.create', [
|
||
|
[
|
||
|
'name' => 'Dashboard for Sysinfo + HA test',
|
||
|
'private' => 0,
|
||
|
'pages' => [
|
||
|
[
|
||
|
'name' => 'Page with widgets',
|
||
|
'widgets' => [
|
||
|
[
|
||
|
'type' => 'systeminfo',
|
||
|
'name' => 'System stats view',
|
||
|
'width' => 12,
|
||
|
'height' => 8
|
||
|
],
|
||
|
[
|
||
|
'type' => 'systeminfo',
|
||
|
'name' => 'High availability nodes view',
|
||
|
'x' => 12,
|
||
|
'y' => 0,
|
||
|
'width' => 12,
|
||
|
'height' => 8,
|
||
|
'fields' => [
|
||
|
[
|
||
|
'type' => 0,
|
||
|
'name' => 'info_type',
|
||
|
'value' => 1
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
'name' => 'Dashboard for SysInfo widget test',
|
||
|
'private' => 0,
|
||
|
'pages' => [
|
||
|
[
|
||
|
'name' => 'Page for creating widgets',
|
||
|
'widgets' => []
|
||
|
],
|
||
|
[
|
||
|
'name' => 'Page for updating widgets',
|
||
|
'widgets' => [
|
||
|
[
|
||
|
'type' => 'systeminfo',
|
||
|
'name' => 'System stats view',
|
||
|
'width' => 12,
|
||
|
'height' => 8
|
||
|
],
|
||
|
[
|
||
|
'type' => 'systeminfo',
|
||
|
'name' => 'HA nodes view',
|
||
|
'x' => 12,
|
||
|
'y' => 0,
|
||
|
'width' => 12,
|
||
|
'height' => 8,
|
||
|
'fields' => [
|
||
|
[
|
||
|
'type' => 0,
|
||
|
'name' => 'info_type',
|
||
|
'value' => 1
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
self::$dashboardid = $response['dashboardids'][0];
|
||
|
self::$widgets_dashboardid = $response['dashboardids'][1];
|
||
|
}
|
||
|
|
||
|
public function testDashboardSystemInformationWidget_checkDisabledHA() {
|
||
|
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.self::$dashboardid)->waitUntilReady();
|
||
|
$this->assertScreenshotExcept(CDashboardElement::find()->one()->waitUntilReady(),
|
||
|
$this->query('xpath://table[@class="list-table sticky-header"]/tbody/tr[3]/td[1]')
|
||
|
->waitUntilVisible()->one(), 'widget_without_ha'
|
||
|
);
|
||
|
}
|
||
|
|
||
|
public function testDashboardSystemInformationWidget_Create() {
|
||
|
$widgets = [
|
||
|
[
|
||
|
'fields' => [
|
||
|
'Name' => 'Widget with default Show',
|
||
|
'Refresh interval' => '2 minutes'
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
'fields' => ['Show' => 'High availability nodes']
|
||
|
]
|
||
|
];
|
||
|
$this->executeWidgetAction($widgets, 'create');
|
||
|
}
|
||
|
|
||
|
public function testDashboardSystemInformationWidget_Update() {
|
||
|
$widgets = [
|
||
|
[
|
||
|
'old_name' => 'System stats view',
|
||
|
'fields' => [
|
||
|
'Name' => 'Updated to HA nodes view',
|
||
|
'Show' => 'High availability nodes',
|
||
|
'Refresh interval' => '30 seconds'
|
||
|
],
|
||
|
'not_last' => true
|
||
|
],
|
||
|
[
|
||
|
'old_name' => 'HA nodes view',
|
||
|
'fields' => [
|
||
|
'Name' => 'Updated to System Info view',
|
||
|
'Show' => 'System stats',
|
||
|
'Refresh interval' => '10 minutes'
|
||
|
]
|
||
|
]
|
||
|
];
|
||
|
$this->executeWidgetAction($widgets, 'update');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @onBefore prepareHANodeData
|
||
|
*/
|
||
|
public function testDashboardSystemInformationWidget_checkEnabledHA() {
|
||
|
$this->assertEnabledHACluster(self::$dashboardid);
|
||
|
$this->assertScreenshotExcept(CDashboardElement::find()->one(), self::$skip_fields, 'widgets_with_ha');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function checks that Zabbix server status is updated after failover delay passes and frontend config is re-validated.
|
||
|
*
|
||
|
* @depends testDashboardSystemInformationWidget_checkEnabledHA
|
||
|
*
|
||
|
* @onBefore changeFailoverDelay
|
||
|
*/
|
||
|
public function testDashboardSystemInformationWidget_checkServerStatus() {
|
||
|
$this->assertServerStatusAfterFailover(self::$dashboardid);
|
||
|
}
|
||
|
|
||
|
public function getUserData() {
|
||
|
return [
|
||
|
[
|
||
|
[
|
||
|
'user' => 'admin-zabbix',
|
||
|
'password' => 'zabbix'
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'user' => 'user-zabbix',
|
||
|
'password' => 'zabbix'
|
||
|
]
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function checks that only super-admin users can view HA cluster data.
|
||
|
*
|
||
|
* @depends testDashboardSystemInformationWidget_checkServerStatus
|
||
|
*
|
||
|
* @dataProvider getUserData
|
||
|
*/
|
||
|
public function testDashboardSystemInformationWidget_checkHAPermissions($data) {
|
||
|
$this->page->userLogin($data['user'], $data['password']);
|
||
|
$this->page->open('zabbix.php?action=dashboard.view&dashboardid='.self::$dashboardid)->waitUntilReady();
|
||
|
|
||
|
$dashboard = CDashboardElement::find()->waitUntilReady()->one();
|
||
|
$nodes_table = $dashboard->getWidget('High availability nodes view')->query('xpath:.//table')->asTable()->one();
|
||
|
// No content of the widget in High availability nodes view should be visible to User and Admin user roles.
|
||
|
$this->assertEquals('No permissions to referred object or it does not exist!', $nodes_table->getText());
|
||
|
|
||
|
// HA cluster status should not be visible to User and Admin role users.
|
||
|
$info_table = $dashboard->getWidget('System stats view')->asTable();
|
||
|
$this->assertFalse($info_table->findRow('Parameter', 'High availability cluster')->isValid());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function performs widget creation of update with the given widget parameters.
|
||
|
*
|
||
|
* @param array $widgets widget related information
|
||
|
* @param string $action operation to be performed with the widget
|
||
|
*/
|
||
|
private function executeWidgetAction($widgets, $action) {
|
||
|
$page_name = ($action === 'update') ? 'Page for updating widgets' : 'Page for creating widgets';
|
||
|
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.self::$widgets_dashboardid);
|
||
|
$dashboard = CDashboardElement::find()->one()->waitUntilReady();
|
||
|
$dashboard->edit();
|
||
|
// Open the corresponding dashboard page in case of update.
|
||
|
if ($action === 'update') {
|
||
|
$this->query('xpath://span[@title='.zbx_dbstr($page_name).']')->one()->click();
|
||
|
}
|
||
|
|
||
|
// Execute the required operation for both widgets.
|
||
|
foreach ($widgets as $widget_data) {
|
||
|
if ($action === 'update') {
|
||
|
$form = $dashboard->getWidget($widget_data['old_name'])->edit()->asForm();
|
||
|
}
|
||
|
else {
|
||
|
$form = $dashboard->addWidget()->asForm();
|
||
|
$form->getField('Type')->fill('System information');
|
||
|
}
|
||
|
$form->fill($widget_data['fields']);
|
||
|
$form->submit();
|
||
|
}
|
||
|
// Save the dashboard and check info displayed by the widgets.
|
||
|
$dashboard->save();
|
||
|
if ($action === 'update') {
|
||
|
$this->query('xpath://span[@title='.CXPathHelper::escapeQuotes($page_name).']')->waitUntilClickable()->one()->click();
|
||
|
}
|
||
|
$this->page->waitUntilReady();
|
||
|
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
|
||
|
|
||
|
$this->assertScreenshotExcept(CDashboardElement::find()->one()->waitUntilReady(),
|
||
|
$this->query('xpath://table[@class="list-table sticky-header"]/tbody/tr[3]/td[1]')->waitUntilVisible()->one(),
|
||
|
$action.'_widgets');
|
||
|
|
||
|
foreach ($widgets as $widget_data) {
|
||
|
// Check widget refresh interval.
|
||
|
$refresh_interval = CTestArrayHelper::get($widget_data['fields'], 'Refresh interval', '15 minutes');
|
||
|
$widget = $dashboard->getWidget(CTestArrayHelper::get($widget_data['fields'], 'Name', 'System information'));
|
||
|
$this->assertEquals($refresh_interval, $widget->getRefreshInterval());
|
||
|
|
||
|
// Check that widget with the corresponding name is present in DB.
|
||
|
$widget_sql = 'SELECT count(widgetid) FROM widget WHERE type='.zbx_dbstr('systeminfo').' AND dashboard_pageid IN'.
|
||
|
' (SELECT dashboard_pageid from dashboard_page WHERE name='.zbx_dbstr($page_name).')'.
|
||
|
' AND name='.zbx_dbstr(CTestArrayHelper::get($widget_data['fields'], 'Name', ''));
|
||
|
$this->assertEquals('1', CDBHelper::getValue($widget_sql));
|
||
|
|
||
|
// Check field values when opening widget config and exit edit mode.
|
||
|
$field_values = [
|
||
|
'Type' => 'System information',
|
||
|
'Name' => '',
|
||
|
'Show header' => true,
|
||
|
'Refresh interval' => 'Default (15 minutes)',
|
||
|
'Show' => 'System stats'
|
||
|
];
|
||
|
|
||
|
$form = $widget->edit()->asForm();
|
||
|
$this->assertEquals(array_merge($field_values, $widget_data['fields']), $form->getFields()->asValues());
|
||
|
$form->submit();
|
||
|
$dashboard->cancelEditing();
|
||
|
|
||
|
// Reopen the corresponding Dashboard page if more updated widgets need to be checked.
|
||
|
if ($action === 'update' && CTestArrayHelper::get($widget_data, 'not_last')) {
|
||
|
$this->query('xpath://span[@title='.zbx_dbstr($page_name).']')->waitUntilClickable()->one()->click();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|