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.

218 lines
6.1 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 'vendor/autoload.php';
require_once dirname(__FILE__).'/../CElement.php';
use \Facebook\WebDriver\Remote\RemoteWebElement;
use \Facebook\WebDriver\Exception\UnrecognizedExceptionException;
/**
* Host interface element.
*/
class CHostInterfaceElement extends CMultifieldTableElement {
/**
* @inheritdoc
*/
public static function createInstance(RemoteWebElement $element, $options = []) {
$instance = parent::createInstance($element, array_merge($options, ['normalized' => true]));
$header = 'xpath:.//div['.CXPathHelper::fromClass('interface-row-header').']/div['.CXPathHelper::fromClass('interface-cell').']';
$row = 'xpath:(.//div[('.CXPathHelper::fromClass('interface-row').') and not(contains(@class, "interface-row-header"))])';
$column = 'xpath:.//div['.CXPathHelper::fromClass('interface-cell').']';
$instance->selectors = [
'header' => $header,
'row' => $row,
'column' => $column
];
return $instance;
}
/**
* Add new row.
*
* @param array $values row values
*
* return $this
*/
public function addRow($values) {
$rows = $this->getRows()->count();
// Count amount of rows in each interface block.
$interfaces = ['agent', 'SNMP', 'JMX', 'IPMI'];
$interface_rows = [];
foreach ($interfaces as $interface) {
$container = $this->query('id', $interface.'Interfaces')->one();
$interface_rows[] = $container->query($this->selectors['row'])->all()->count();
}
$interface_rows = array_combine($interfaces, $interface_rows);
// Set the index of row to update.
$index = 0;
switch ($values['type']) {
case 'JMX':
$index += $interface_rows['JMX'];
case 'SNMP':
$index += $interface_rows['SNMP'];
case 'Agent':
$index += $interface_rows['agent'];
break;
case 'IPMI':
$index = $rows;
break;
}
$this->query('button:Add')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->fill($values['type']);
// Wait until new table row appears.
$this->query('xpath:'.CXPathHelper::fromSelector($this->selectors['row']).'['.($rows + 1).']')->waitUntilPresent();
unset($values['type']);
return $this->updateRow($index, $values);
}
/**
* Update row by index.
*
* @param integer $index row index
* @param array $values row values
*
* @throws Exception if not all fields could be found within a row
*
* return $this
*/
public function updateRow($index, $values) {
$row = $this->getRow($index);
$controls = $this->getRowControls($row);
$form = null;
foreach ($values as $name => $value) {
if (array_key_exists($name, $controls)) {
try {
$controls[$name]->fill($value);
}
catch (UnrecognizedExceptionException $e1) {
try {
$controls = $this->getRowControls($this->getRow($index));
$controls[$name]->fill($value);
}
catch (\Exception $e2) {
throw $e1;
}
}
unset($values[$name]);
}
else {
if ($form === null) {
$xpath = 'xpath:.//div['.CXPathHelper::fromClass('list-accordion-item-body').']';
$element = $row->query($xpath)->one(false);
if ($element->isValid()) {
$form = $element->asGridForm(['normalized' => true]);
$fields = $form->getFields();
}
}
if ($name === 'Use combined requests') {
$selector = 'xpath:.//label[contains(text(), "Use combined requests")]/../input';
$row->query($selector)->asCheckbox()->one()->fill($value);
unset($values[$name]);
}
else {
if ($form !== null && $fields->exists($name)) {
$fields->get($name)->fill($value);
unset($values[$name]);
}
}
}
}
if ($values) {
throw new Exception('Failed to set values for fields ['.implode(', ', array_keys($values)).'] when filling'.
' multifield row (controls are not present for those fields).'
);
}
return $this;
}
/**
* Get controls from row.
*
* @param CTableRowElement $row table row
* @param array $headers table headers
*
* @return array
*/
public function getRowControls($row, $headers = null) {
$controls = parent::getRowControls($row, $headers);
$xpath = 'xpath:.//div['.CXPathHelper::fromClass('list-accordion-item-body').']';
$element = $row->query($xpath)->one(false);
if ($element->isValid()) {
$form = $element->asGridForm(['normalized' => true]);
// Expand row for SNMP interface.
$button = $row->getColumn(0)->query('tag:button')->one();
if (in_array($button->getAttribute('title'), ['', 'Expand'])) {
$button->click();
}
foreach ($form->getFields()->filter(new CElementFilter(CElementFilter::VISIBLE)) as $label => $field) {
$controls[$label] = $field;
}
}
return $controls;
}
/*
* @inheritdoc
*/
public function checkValue($expected, $raise_exception = true) {
$bulks = [];
foreach ($expected as $id => &$data) {
$bulks[$id] = CTestArrayHelper::get($data, 'Use combined requests');
unset($data['Use combined requests']);
}
unset($data);
$selector = 'xpath:.//label[contains(text(), "Use combined requests")]/../input';
if (parent::checkValue($expected, $raise_exception)) {
$rows = $this->getRows();
foreach ($rows as $id => $row) {
if ($bulks[$id] === null) {
continue;
}
if (!$row->query($selector)->asCheckbox()->one()->checkValue($bulks[$id], $raise_exception)) {
return false;
}
}
}
return true;
}
}