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.

1795 lines
31 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/CIntegrationTest.php';
/**
* Test suite for alerting for services.
*
* @required-components server, proxy
* @configurationDataProvider configurationProvider
* @backup config, functions, globalmacro
* @backup group_prototype, host_discovery, host_inventory, hostmacro, host_rtdata, hosts, hosts_groups, hosts_templates
* @backup hstgrp, interface, item_condition, item_discovery, item_parameter, item_preproc, item_rtdata, items
* @backup lld_macro_path, lld_override, lld_override_condition, lld_override_opdiscover, lld_override_operation
* @backup lld_override_opstatus, proxy, proxy_rtdata, auditlog, changelog, proxy_history, config_autoreg_tls
* @backup expressions, ha_node, regexps
*/
class testProxyConfSync extends CIntegrationTest
{
private $expected_initial = [
[
'config' =>
[
'insert' => '1',
'update' => '0',
'delete' => '0'
]
],
[
'autoreg' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'autoreghost' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'hosts' =>
[
'insert' => '15',
'update' => '0',
'delete' => '0'
]
],
[
'host_invent' =>
[
'insert' => '3',
'update' => '0',
'delete' => '0'
]
],
[
'templates' =>
[
'insert' => '4',
'update' => '0',
'delete' => '0'
]
],
[
'globmacros' =>
[
'insert' => '3',
'update' => '0',
'delete' => '0'
]
],
[
'hostmacros' =>
[
'insert' => '5',
'update' => '0',
'delete' => '0'
]
],
[
'interfaces' =>
[
'insert' => '15',
'update' => '0',
'delete' => '0'
]
],
[
'items' =>
[
'insert' => '78',
'update' => '0',
'delete' => '0'
]
],
[
'template_items' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'prototype_items' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'item_discovery' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'triggers' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'trigdeps' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'trigtags' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'hosttags' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'itemtags' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'functions' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'expressions' =>
[
'insert' => '1',
'update' => '0',
'delete' => '0'
]
],
[
'actions' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'operations' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'conditions' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'corr' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'corr_cond' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'corr_op' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'hgroups' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'itempproc' =>
[
'insert' => '11',
'update' => '0',
'delete' => '0'
]
],
[
'itemscriptparam' =>
[
'insert' => '2',
'update' => '0',
'delete' => '0'
]
],
[
'maintenance' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'drules' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'httptests' =>
[
'insert' => '3',
'update' => '0',
'delete' => '0'
]
],
[
'connector' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'connector_tag' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'proxy' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
]
];
private $expected_update =
[
[
"config" =>
[
"insert" =>
"1",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"autoreg" =>
[
"insert" =>
"0",
"update" =>
"1",
"delete" =>
"0"
]
],
[
'autoreghost' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
"hosts" =>
[
"insert" =>
"0",
"update" =>
"15",
"delete" =>
"0"
]
],
[
"host_invent" =>
[
"insert" =>
"0",
"update" =>
"1",
"delete" =>
"2"
]
],
[
"templates" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"globmacros" =>
[
"insert" =>
"0",
"update" =>
"3",
"delete" =>
"0"
]
],
[
"hostmacros" =>
[
"insert" =>
"2",
"update" =>
"2",
"delete" =>
"2"
]
],
[
"interfaces" =>
[
"insert" =>
"0",
"update" =>
"8",
"delete" =>
"0"
]
],
[
"items" =>
[
"insert" =>
"0",
"update" =>
"49",
"delete" =>
"0"
]
],
[
"template_items" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"prototype_items" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"item_discovery" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"triggers" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"trigdeps" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"trigtags" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"hosttags" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"itemtags" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"functions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"expressions" =>
[
"insert" =>
"1",
"update" =>
"0",
"delete" =>
"1"
]
],
[
"actions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"operations" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"conditions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"corr" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"corr_cond" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"corr_op" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"hgroups" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"itempproc" =>
[
"insert" =>
"0",
"update" =>
"6",
"delete" =>
"0"
]
],
[
"itemscriptparam" =>
[
"insert" =>
"0",
"update" =>
"1",
"delete" =>
"0"
]
],
[
"maintenance" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"drules" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"httptests" =>
[
"insert" =>
"0",
"update" =>
"3",
"delete" =>
"0"
]
],
[
'connector' =>
[
'insert' =>
'0',
'update' =>
'0',
'delete' =>
'0'
]
],
[
'connector_tag' =>
[
'insert' =>
'0',
'update' =>
'0',
'delete' =>
'0'
]
],
[
'proxy' =>
[
'insert' =>
'0',
'update' =>
'0',
'delete' =>
'0'
]
]
];
private $expected_delete = [
[
"config" =>
[
"insert" =>
"1",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"autoreg" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
'autoreghost' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
"hosts" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"15"
]
],
[
"host_invent" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"1"
]
],
[
"templates" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"4"
]
],
[
"globmacros" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"hostmacros" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"5"
]
],
[
"interfaces" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"15"
]
],
[
"items" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"78"
]
],
[
"template_items" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"prototype_items" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"78"
]
],
[
"item_discovery" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"triggers" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"trigdeps" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"trigtags" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"hosttags" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"itemtags" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"functions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"expressions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"1"
]
],
[
"actions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"operations" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"conditions" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"corr" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"corr_cond" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"corr_op" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"hgroups" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
"itempproc" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"11"
]
],
[
"itemscriptparam" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"2"
]
],
[
"maintenance" =>
[
"insert" =>
"0",
"update" =>
"0",
"delete" =>
"0"
]
],
[
'drules' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'httptests' =>
[
'insert' => '0',
'update' => '0',
'delete' => '3'
]
],
[
'connector' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'connector_tag' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
],
[
'proxy' =>
[
'insert' => '0',
'update' => '0',
'delete' => '0'
]
]
];
private static $regexpid;
private static $vaultmacroid;
private static $secretmacroid;
private static $tlshostid;
/**
* @inheritdoc
*/
public function prepareData()
{
$this->purgeExisting('host', 'hostids');
$this->purgeExisting('proxy', 'extend');
$this->purgeExisting('template', 'templateids');
$this->purgeExisting('item', 'itemids');
$this->purgeExisting('trigger', 'triggerids');
$this->purgeExisting('regexp', 'extend');
$this->purgeHostGroups();
$this->purgeGlobalMacros();
return true;
}
public function createProxy()
{
$response = $this->call('proxy.create', [
'name' => 'Proxy',
'operating_mode' => PROXY_OPERATING_MODE_PASSIVE,
'hosts' => [],
'address' => '127.0.0.1',
'port' => PHPUNIT_PORT_PREFIX.self::PROXY_PORT_SUFFIX
]);
$this->assertArrayHasKey("proxyids", $response['result']);
}
/**
* Component configuration provider for server related tests.
*
* @return array
*/
public function configurationProvider()
{
return [
self::COMPONENT_SERVER => [
'LogFileSize' => 0,
'DebugLevel' => 5,
'Vault' => 'CyberArk',
'VaultURL' => 'https://127.0.0.1:1858'
],
self::COMPONENT_PROXY => [
'ProxyMode' => PROXY_OPERATING_MODE_PASSIVE,
'DebugLevel' => 5,
'LogFileSize' => 0,
'Hostname' => 'Proxy',
'ListenPort' => PHPUNIT_PORT_PREFIX.self::PROXY_PORT_SUFFIX
]
];
}
private function parseSyncResults()
{
$log = file_get_contents(self::getLogPath(self::COMPONENT_PROXY));
$data = explode("\n", $log);
$sync_lines = preg_grep('/zbx_dc_sync_configuration.*\([0-9]+\/[0-9]+\/[0-9]+\)\.$/', $data);
$sync_lines1 = preg_replace(
[
"/^\s*[0-9]+:[0-9]+:[0-9]+\.[0-9]+ zbx_dc_sync_configuration\(\) /",
"/\s+/",
"/:sql:[0-9]+\.[0-9]+sync:[0-9]+\.[0-9]+sec/",
"/:sql:[0-9]+\.[0-9]+sec/"
],
"",
$sync_lines
);
$sync_lines2 = preg_replace(
[
"/(\(\))|(\()/",
"/\)\.|\./"
],
[
":",
""
],
$sync_lines1
);
$results = [];
foreach ($sync_lines2 as $v) {
$o = explode(":", $v);
$subject = $o[0];
$operations = explode("/", $o[1]);
if (count($operations) < 3) {
continue;
}
$pair = [
$subject => [
'insert' => $operations[0],
'update' => $operations[1],
'delete' => $operations[2]
]
];
$exists = false;
foreach ($results as &$existing_obj) {
if (array_key_exists($subject, $existing_obj)) {
$exists = true;
$existing_obj = $pair;
break;
}
}
if (!$exists)
array_push($results, $pair);
}
return $results;
}
private function purgeHostGroups()
{
$response = $this->call('hostgroup.get', [
'output' => 'extend',
'preservekeys' => true
]);
$this->assertArrayHasKey('result', $response);
$filtered_groups = array_filter($response['result'], function ($obj) {
return $obj['name'] != 'Discovered hosts';
});
$ids = array_keys($filtered_groups);
if (empty($ids)) {
return;
}
$response = $this->call('hostgroup.delete', $ids);
}
private function purgeGlobalMacros()
{
$response = $this->call('usermacro.get', [
'output' => 'extend',
'globalmacro' => true,
'preservekeys' => true
]);
$this->assertArrayHasKey('result', $response);
$ids = array_keys($response['result']);
if (empty($ids)) {
return;
}
$response = $this->call('usermacro.deleteglobal', $ids);
}
private function purgeExisting($method, $field_name)
{
$params = [
'output' => $field_name,
'preservekeys' => true
];
$response = $this->call($method . '.get', $params);
$this->assertArrayHasKey('result', $response);
$ids = array_keys($response['result']);
if (empty($ids)) {
return;
}
$response = $this->call($method . '.delete', $ids);
}
private function createGlobalMacros()
{
$response = $this->call('usermacro.createglobal', [
'macro' => '{$GLOBDELAY}',
'value' => '1'
]);
$this->assertArrayHasKey('result', $response);
$this->assertArrayHasKey('globalmacroids', $response['result']);
$response = $this->call('usermacro.createglobal', [
'macro' => '{$SECRETMACRO}',
'value' => '1234567890',
'type' => 1
]);
$this->assertArrayHasKey('result', $response);
$this->assertArrayHasKey('globalmacroids', $response['result']);
self::$secretmacroid = $response['result']['globalmacroids'][0];
$response = $this->call('usermacro.createglobal', [
'macro' => '{$VAULTMACRO}',
'value' => 'secret/zabbix:password',
'type' => 2
]);
$this->assertArrayHasKey('result', $response);
$this->assertArrayHasKey('globalmacroids', $response['result']);
self::$vaultmacroid = $response['result']['globalmacroids'][0];
}
private function updateAutoregistration()
{
$response = $this->call('autoregistration.update', [
'tls_accept' => '3',
'tls_psk_identity' => 'PSK 001',
'tls_psk' => '12111595725ac58dd977beef14b97461a7c1045b9a1c923453302c5473193478'
]);
$this->assertArrayHasKey('result', $response);
$this->assertEquals(true, $response['result']);
}
private function updateGlobalMacro()
{
$response = $this->call('usermacro.get', [
'output' => 'extend',
'globalmacro' => 'true'
]);
$this->assertArrayHasKey(0, $response['result']);
$this->assertArrayHasKey('globalmacroid', $response['result'][0]);
$globalmacroid = $response['result'][0]['globalmacroid'];
$response = $this->call('usermacro.updateglobal', [
'globalmacroid' => $globalmacroid,
'macro' => '{$UU}',
'value' => 'updated'
]);
$this->assertArrayHasKey('globalmacroids', $response['result']);
$response = $this->call('usermacro.updateglobal', [
'globalmacroid' => self::$secretmacroid,
'value' => 'qwerasdfzxcv'
]);
$this->assertArrayHasKey('globalmacroids', $response['result']);
$response = $this->call('usermacro.updateglobal', [
'globalmacroid' => self::$vaultmacroid,
'value' => 'secret/zabbix:ZABBIX123'
]);
$this->assertArrayHasKey('globalmacroids', $response['result']);
}
private function importTemplate($filename)
{
$xml = file_get_contents('integration/data/' . $filename);
$response = $this->call('configuration.import', [
'format' => 'xml',
'source' => $xml,
'rules' => [
'template_groups' =>
[
'updateExisting' => true,
'createMissing' => true
],
'host_groups' =>
[
'updateExisting' => true,
'createMissing' => true
],
'templates' =>
[
'updateExisting' => true,
'createMissing' => true
],
'valueMaps' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'templateDashboards' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'templateLinkage' =>
[
'createMissing' => true,
'deleteMissing' => false
],
'items' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'discoveryRules' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'triggers' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'graphs' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'httptests' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
]
]
]);
}
private function importTemplateForUpdate($filename)
{
$xml = file_get_contents('integration/data/' . $filename);
$response = $this->call('configuration.import', [
'format' => 'xml',
'source' => $xml,
'rules' => [
'template_groups' =>
[
'updateExisting' => true,
'createMissing' => false
],
'host_groups' =>
[
'updateExisting' => true,
'createMissing' => false
],
'templates' =>
[
'updateExisting' => true,
'createMissing' => false
],
'valueMaps' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
],
'templateDashboards' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
],
'templateLinkage' =>
[
'createMissing' => false,
'deleteMissing' => false
],
'items' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
],
'discoveryRules' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
],
'triggers' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
],
'graphs' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
],
'httptests' =>
[
'updateExisting' => true,
'createMissing' => false,
'deleteMissing' => false
]
]
]);
}
private function createRegexp()
{
$response = $this->call('regexp.create', [
'name' => 'global regexp test',
'test_string' => '/boot',
'expressions' => [
[
'expression' => '.*',
'expression_type' => EXPRESSION_TYPE_FALSE,
'case_sensitive' => 1
]
]
]);
$this->assertArrayHasKey("regexpids", $response['result']);
self::$regexpid = $response['result']['regexpids'][0];
}
private function updateRegexp()
{
$response = $this->call('regexp.update', [
'regexpid' => self::$regexpid,
'test_string' => '/tmp',
'expressions' => [
[
'expression' => '.*a',
'expression_type' => EXPRESSION_TYPE_TRUE,
'case_sensitive' => 1
]
]
]);
$this->assertArrayHasKey("regexpids", $response['result']);
}
private function setupTlsForHost()
{
$response = $this->call('host.get', [
'output' => 'hostids',
'filter' => [
'host' => ['Host1']
],
'preservekeys' => true
]);
$this->assertArrayHasKey('result', $response);
self::$tlshostid = array_key_first($response['result']);
$response = $this->call('host.update', [
'hostid' => self::$tlshostid,
'tls_connect' => HOST_ENCRYPTION_PSK,
'tls_accept' => HOST_ENCRYPTION_PSK | HOST_ENCRYPTION_CERTIFICATE,
'tls_issuer' => 'iss',
'tls_subject' => 'sub',
'tls_psk_identity' => '2790d1e1781449f8879714a21fb706f9f008910ccf6b7339bb1975bc33e0c449',
'tls_psk' => '1e07e499695b1c5f8fc1ccb5ee935240ae1b85d0ac0f821c7133aa17852bf7d8'
]);
$this->assertArrayHasKey('hostids', $response['result']);
$this->assertEquals(1, count($response['result']['hostids']));
}
public function loadInitialConfiguration()
{
$this->createRegexp();
$this->createGlobalMacros();
$this->importTemplate('confsync_proxy_tmpl.xml');
$xml = file_get_contents('integration/data/confsync_proxy_hosts.xml');
$response = $this->call('configuration.import', [
'format' => 'xml',
'source' => $xml,
'rules' => [
'host_groups' =>
[
'updateExisting' => true,
'createMissing' => true
],
'hosts' =>
[
'updateExisting' => true,
'createMissing' => true
],
'valueMaps' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'templateLinkage' =>
[
'createMissing' => true,
'deleteMissing' => false
],
'items' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'discoveryRules' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'triggers' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'graphs' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
],
'httptests' =>
[
'updateExisting' => true,
'createMissing' => true,
'deleteMissing' => false
]
]
]);
$this->setupTlsForHost();
}
private function disableAllHosts()
{
$response = $this->call('host.get', [
'output' => 'hostid',
'preservekeys' => true
]);
$this->assertArrayHasKey('result', $response);
$ids = array_keys($response['result']);
if (empty($ids)) {
return;
}
foreach ($ids as $hostid) {
$response = $this->call('host.update', [
'hostid' => $hostid,
'status' => 1
]);
}
}
private function updateTlsForHost()
{
$response = $this->call('host.update', [
'hostid' => self::$tlshostid,
'tls_connect' => HOST_ENCRYPTION_CERTIFICATE,
'tls_accept' => HOST_ENCRYPTION_CERTIFICATE,
'tls_issuer' => 'iss',
'tls_subject' => 'sub'
]);
$this->assertArrayHasKey('hostids', $response['result']);
$this->assertEquals(1, count($response['result']['hostids']));
}
/**
* @required-components server, proxy
*/
public function testProxyConfSync_Insert()
{
self::stopComponent(self::COMPONENT_SERVER);
self::clearLog(self::COMPONENT_SERVER);
self::stopComponent(self::COMPONENT_PROXY);
self::clearLog(self::COMPONENT_PROXY);
$this->purgeExisting('host', 'hostids');
$this->purgeExisting('proxy', 'extend');
$this->purgeExisting('template', 'templateids');
$this->purgeExisting('item', 'itemids');
$this->purgeExisting('trigger', 'triggerids');
$this->purgeExisting('regexp', 'extend');
$this->purgeHostGroups();
$this->purgeGlobalMacros();
$this->createProxy();
self::startComponent(self::COMPONENT_SERVER);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1);
self::startComponent(self::COMPONENT_PROXY);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, 'sending configuration data to proxy "Proxy"', true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "received configuration data from server", true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "memory statistics for configuration cache", true, 90, 1);
self::stopComponent(self::COMPONENT_SERVER);
self::clearLog(self::COMPONENT_SERVER);
self::stopComponent(self::COMPONENT_PROXY);
self::clearLog(self::COMPONENT_PROXY);
$this->loadInitialConfiguration();
self::startComponent(self::COMPONENT_SERVER);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1);
self::startComponent(self::COMPONENT_PROXY);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, 'sending configuration data to proxy "Proxy"', true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "received configuration data from server", true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "memory statistics for configuration cache", true, 90, 1);
$got = $this->parseSyncResults();
$this->assertEquals($this->expected_initial, $got);
return true;
}
public function testProxyConfSync_Update()
{
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, 'sending configuration data to proxy "Proxy"', true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "received configuration data from server", true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "memory statistics for configuration cache", true, 90, 1);
self::stopComponent(self::COMPONENT_SERVER);
self::clearLog(self::COMPONENT_SERVER);
self::clearLog(self::COMPONENT_PROXY);
$this->updateRegexp();
$this->updateAutoregistration();
$this->importTemplateForUpdate('confsync_proxy_tmpl_updated.xml');
$xml = file_get_contents('integration/data/confsync_proxy_hosts_updated.xml');
$response = $this->call('configuration.import', [
'format' => 'xml',
'source' => $xml,
'rules' => [
'hosts' => [
'createMissing' => false,
'updateExisting' => true
],
'items' => [
'createMissing' => false,
'updateExisting' => true
],
'host_groups' => [
'createMissing' => false,
'updateExisting' => true
],
'discoveryRules' => [
'createMissing' => false,
'updateExisting' => true,
'deleteMissing' => false
],
'httptests' => [
'createMissing' => false,
'updateExisting' => true,
'deleteMissing' => false
],
'triggers' => [
'createMissing' => false,
'updateExisting' => true,
'deleteMissing' => false
],
'templateLinkage' => [
'createMissing' => false
]
]
]);
$this->updateGlobalMacro();
$this->updateTlsForHost();
$this->disableAllHosts();
self::startComponent(self::COMPONENT_SERVER);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, 'sending configuration data to proxy "Proxy"', true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "received configuration data from server", true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "memory statistics for configuration cache", true, 90, 1);
$got = $this->parseSyncResults();
// Count of updated interfaces can vary due to errors being treated as configuration changes
foreach ($got as &$obj) {
if (array_key_exists('interfaces', $obj)) {
if ($obj['interfaces']['update'] > 8)
$obj['interfaces']['update'] = 8;
}
}
$this->assertEquals($this->expected_update, $got);
return true;
}
public function testProxyConfSync_Delete()
{
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, 'sending configuration data to proxy "Proxy"', true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "received configuration data from server", true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "memory statistics for configuration cache", true, 90, 1);
self::stopComponent(self::COMPONENT_SERVER);
self::clearLog(self::COMPONENT_SERVER);
self::clearLog(self::COMPONENT_PROXY);
$this->purgeExisting('maintenance', 'maintenanceids');
$this->purgeExisting('host', 'hostids');
$this->purgeExisting('template', 'templateids');
$this->purgeExisting('correlation', 'correlationids');
$this->purgeExisting('regexp', 'extend');
$this->purgeExisting('item', 'itemids');
$this->purgeHostGroups();
self::startComponent(self::COMPONENT_SERVER);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_SERVER, 'sending configuration data to proxy "Proxy"', true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "received configuration data from server", true, 90, 1);
$this->waitForLogLineToBePresent(self::COMPONENT_PROXY, "memory statistics for configuration cache", true, 90, 1);
$got = $this->parseSyncResults();
$this->assertEquals($this->expected_delete, $got);
return true;
}
}