diff options
author | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2022-11-11 15:39:40 +0300 |
---|---|---|
committer | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2022-11-11 15:39:40 +0300 |
commit | 3bffc5ccdbb26e7b3226218d5b21f1e107e78ba4 (patch) | |
tree | 77ffbfa1b3c6f322a1cf775275cdf37b4986dc51 | |
parent | 8307c5ed9c3734b8d91e2d339af9a42deca66951 (diff) | |
parent | 8fe758308d46958ddee5fc3438054d7883ccfed0 (diff) |
.......... [DEV-2329] added int test for server-proxy conf sync
Merge in ZBX/zabbix from feature/DEV-2329-6.3-a to master
* commit '8fe758308d46958ddee5fc3438054d7883ccfed0':
.......... [DEV-2329] fix
.......... [DEV-2329] fi
.......... [DEV-2329] fix
.......... [DEV-2329] fix
.......... [DEV-2329] fix
.......... [DEV-2329] fix
.......... [DEV-2329] added backup/restore annotation
.......... [DEV-2329] added backup/restore annotation
.......... [DEV-2329] reordered test
.......... [DEV-2329] added backup/restore annotation
.......... [DEV-2329] fix
.......... [DEV-2329] reverted unnecessary changes
.......... [DEV-2329] added data collection test
.......... [DEV-2329] added full implementation of proxy-server confsync test
.......... [DEV-2329] added full implementation of proxy-server confsync test
.......... [DEV-2329] implemented
.......... [DEV-2329] experimental impl
-rw-r--r-- | ui/tests/integration/IntegrationTests.php | 2 | ||||
-rw-r--r-- | ui/tests/integration/data/confsync_proxy_hosts.xml | 983 | ||||
-rw-r--r-- | ui/tests/integration/data/confsync_proxy_hosts_updated.xml | 995 | ||||
-rw-r--r-- | ui/tests/integration/data/confsync_proxy_tmpl.xml | 682 | ||||
-rw-r--r-- | ui/tests/integration/data/confsync_proxy_tmpl_updated.xml | 718 | ||||
-rw-r--r-- | ui/tests/integration/testDataCollection.php | 86 | ||||
-rw-r--r-- | ui/tests/integration/testProxyConfSync.php | 1673 |
7 files changed, 5139 insertions, 0 deletions
diff --git a/ui/tests/integration/IntegrationTests.php b/ui/tests/integration/IntegrationTests.php index d94bb556a23..ab23c3d4639 100644 --- a/ui/tests/integration/IntegrationTests.php +++ b/ui/tests/integration/IntegrationTests.php @@ -19,6 +19,7 @@ **/ require_once dirname(__FILE__).'/testInitialConfSync.php'; +require_once dirname(__FILE__).'/testProxyConfSync.php'; require_once dirname(__FILE__).'/testTimescaleDb.php'; require_once dirname(__FILE__).'/testDataCollection.php'; require_once dirname(__FILE__).'/testDiagnosticDataTask.php'; @@ -72,6 +73,7 @@ class IntegrationTests { $suite->addTestSuite('testUserParametersReload'); $suite->addTestSuite('testTriggerState'); $suite->addTestSuite('testActiveAvailability'); + $suite->addTestSuite('testProxyConfSync'); $suite->addTestSuite('testInitialConfSync'); return $suite; diff --git a/ui/tests/integration/data/confsync_proxy_hosts.xml b/ui/tests/integration/data/confsync_proxy_hosts.xml new file mode 100644 index 00000000000..0ebea8c800d --- /dev/null +++ b/ui/tests/integration/data/confsync_proxy_hosts.xml @@ -0,0 +1,983 @@ +<?xml version="1.0" encoding="UTF-8"?> +<zabbix_export> + <version>6.4</version> + <date>2022-09-12T13:52:17Z</date> + <host_groups> + <host_group> + <uuid>c9ad86935aa14454a99f3bb442dccb2c</uuid> + <name>HG1</name> + </host_group> + <host_group> + <uuid>9a4a9554205541f1bb119cf1cfa3dfd4</uuid> + <name>HG1/Subgroup</name> + </host_group> + </host_groups> + <hosts> + <host> + <host>Host1</host> + <name>Host1</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host2</host> + <name>Host2</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <type>SNMP</type> + <port>161</port> + <details> + <community>{$SNMP_COMMUNITY}</community> + </details> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host3</host> + <name>Host3</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <type>IPMI</type> + <port>623</port> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host4</host> + <name>Host4</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host5</host> + <name>Host5</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostInventory</host> + <name>HostInventory</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory> + <type>aaaaaaaaaaaaaaaa</type> + <type_full>aaaaaaaaaaaaaaaa</type_full> + <name>aaaaaaaaaaaaaaaa</name> + <alias>aaaaaaaaaaaaaaaa</alias> + <os>aaaaaaaaaaaaaaaa</os> + <os_full>aaaaaaaaaaaaaaaa</os_full> + <os_short>aaaaaaaaaaaaaaaa</os_short> + <serialno_a>aaaaaaaaaaaaaaaa</serialno_a> + <serialno_b>aaaaaaaaaaaaaaaa</serialno_b> + <tag>aaaaaaaaaaaaaaaa</tag> + <asset_tag>aaaaaaaaaaaaaaaa</asset_tag> + <macaddress_a>aaaaaaaaaaaaaaaa</macaddress_a> + <macaddress_b>aaaaaaaaaaaaaaaa</macaddress_b> + <hardware>aaaaaaaaaaaaaaaa</hardware> + <hardware_full>aaaaaaaaaaaaaaaa</hardware_full> + <software>aaaaaaaaaaaaaaaa</software> + <software_full>aaaaaaaaaaaaaaaa</software_full> + <software_app_a>aaaaaaaaaaaaaaaa</software_app_a> + <software_app_b>aaaaaaaaaaaaaaaa</software_app_b> + <software_app_c>aaaaaaaaaaaaaaaa</software_app_c> + <software_app_d>aaaaaaaaaaaaaaaa</software_app_d> + <software_app_e>aaaaaaaaaaaaaaaa</software_app_e> + <contact>aaaaaaaaaaaaaaaa</contact> + <location>aaaaaaaaaaaaaaaa</location> + <location_lat>aaaaaaaaaaaaaaaa</location_lat> + <location_lon>aaaaaaaaaaaaaaaa</location_lon> + <notes>aaaaaaaaaaaaaaaa</notes> + <chassis>aaaaaaaaaaaaaaaa</chassis> + <model>aaaaaaaaaaaaaaaa</model> + <hw_arch>aaaaaaaaaaaaaaaa</hw_arch> + <vendor>aaaaaaaaaaaaaaaa</vendor> + <contract_number>aaaaaaaaaaaaaaaa</contract_number> + <installer_name>aaaaaaaaaaaaaaaa</installer_name> + <deployment_status>aaaaaaaaaaaaaaaa</deployment_status> + <url_a>aaaaaaaaaaaaaaaa</url_a> + <url_b>aaaaaaaaaaaaaaaa</url_b> + <url_c>aaaaaaaaaaaaaaaa</url_c> + <host_networks>aaaaaaaaaaaaaaaa</host_networks> + <host_netmask>aaaaaaaaaaaaaaaa</host_netmask> + <host_router>aaaaaaaaaaaaaaaa</host_router> + <oob_ip>aaaaaaaaaaaaaaaa</oob_ip> + <oob_netmask>aaaaaaaaaaaaaaaa</oob_netmask> + <oob_router>aaaaaaaaaaaaaaaa</oob_router> + <date_hw_purchase>aaaaaaaaaaaaaaaa</date_hw_purchase> + <date_hw_install>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</date_hw_install> + <date_hw_expiry>aaaaaaaaaaaaaaaa</date_hw_expiry> + <date_hw_decomm>aaaaaaaaaaaaaaaa</date_hw_decomm> + <site_address_a>aaaaaaaaaaaaaaaa</site_address_a> + <site_address_b>aaaaaaaaaaaaaaaa</site_address_b> + <site_address_c>aaaaaaaaaaaaaaaa</site_address_c> + <site_city>aaaaaaaaaaaaaaaa</site_city> + <site_state>aaaaaaaaaaaaaaaa</site_state> + <site_country>aaaaaaaaaaaaaaaa</site_country> + <site_zip>aaaaaaaaaaaaaaaa</site_zip> + <site_rack>aaaaaaaaaaaaaaaa</site_rack> + <site_notes>aaaaaaaaaaaaaaaa</site_notes> + <poc_1_name>aaaaaaaaaaaaaaaa</poc_1_name> + <poc_1_email>aaaaaaaaaaaaaaaa</poc_1_email> + <poc_1_phone_a>aaaaaaaaaaaaaaaa</poc_1_phone_a> + <poc_1_phone_b>aaaaaaaaaaaaaaaa</poc_1_phone_b> + <poc_1_cell>aaaaaaaaaaaaaaaa</poc_1_cell> + <poc_1_screen>aaaaaaaaaaaaaaaa</poc_1_screen> + <poc_1_notes>aaaaaaaaaaaaaaaa</poc_1_notes> + <poc_2_name>aaaaaaaaaaaaaaaa</poc_2_name> + <poc_2_email>aaaaaaaaaaaaaaaa</poc_2_email> + <poc_2_phone_a>aaaaaaaaaaaaaaaa</poc_2_phone_a> + <poc_2_phone_b>aaaaaaaaaaaaaaaa</poc_2_phone_b> + <poc_2_cell>aaaaaaaaaaaaaaaa</poc_2_cell> + <poc_2_screen>aaaaaaaaaaaaaaaa</poc_2_screen> + <poc_2_notes>aaaaaaaaaaaaaaaa</poc_2_notes> + </inventory> + </host> + <host> + <host>HostInventoryAutomatic</host> + <name>HostInventoryAutomatic</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.0.111</ip> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>Hostname</name> + <key>agent.hostname</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>NAME</inventory_link> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Chassis</name> + <key>system.hw.chassis[model]</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>HARDWARE_FULL</inventory_link> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Uname</name> + <key>system.uname</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>OS</inventory_link> + <interface_ref>if1</interface_ref> + </item> + </items> + <inventory_mode>AUTOMATIC</inventory_mode> + </host> + <host> + <host>HostMultilevelTmpl</host> + <name>HostMultilevelTmpl</name> + <proxy> + <name>Proxy</name> + </proxy> + <templates> + <template> + <name>bbbtmpl</name> + </template> + </templates> + <groups> + <group> + <name>HG1/Subgroup</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.0.122</ip> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>ItemWithMultilevelMacros</name> + <key>vfs.dir.count[/tmp/{$UU},{$CHLDTMPLMACRO},{$PRNTTMPLMACRO}]</key> + <delay>{$PRNTTMPLMACRO}</delay> + <interface_ref>if1</interface_ref> + </item> + </items> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithDiscovery</host> + <name>HostWithDiscovery</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <discovery_rules> + <discovery_rule> + <name>DiscoveryRule</name> + <type>SCRIPT</type> + <key>dcrule</key> + <delay>22s</delay> + <params>return "";</params> + <filter> + <conditions> + <condition> + <macro>{#X}</macro> + <value>Y</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + <item_prototypes> + <item_prototype> + <name>ItemProto1</name> + <type>CALCULATED</type> + <key>proto[{#X}]</key> + <params>1</params> + <trigger_prototypes> + <trigger_prototype> + <expression>last(/HostWithDiscovery/proto[{#X}])=1</expression> + <name>TriggerPrototype</name> + <priority>DISASTER</priority> + <manual_close>YES</manual_close> + </trigger_prototype> + </trigger_prototypes> + </item_prototype> + </item_prototypes> + <host_prototypes> + <host_prototype> + <host>{#X}.HostPrototype</host> + <name>{#X}.HostPrototype</name> + <inventory_mode>DISABLED</inventory_mode> + <group_links> + <group_link> + <group> + <name>HG1</name> + </group> + </group_link> + </group_links> + </host_prototype> + </host_prototypes> + <lld_macro_paths> + <lld_macro_path> + <lld_macro>{#X}</lld_macro> + <path>$.a</path> + </lld_macro_path> + </lld_macro_paths> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>a</parameter> + <parameter>b</parameter> + </parameters> + </step> + </preprocessing> + <overrides> + <override> + <name>Override</name> + <step>1</step> + <stop>STOP</stop> + <filter> + <conditions> + <condition> + <macro>{#S}</macro> + <value>s</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + <operations> + <operation> + <operationobject>ITEM_PROTOTYPE</operationobject> + <value>991</value> + <status>DISABLED</status> + <discover>NO_DISCOVER</discover> + </operation> + </operations> + </override> + </overrides> + </discovery_rule> + </discovery_rules> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithItems</host> + <name>HostWithItems</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <interface_ref>if1</interface_ref> + </interface> + <interface> + <type>SNMP</type> + <port>161</port> + <details> + <community>{$SNMP_COMMUNITY}</community> + </details> + <interface_ref>if2</interface_ref> + </interface> + <interface> + <type>IPMI</type> + <port>623</port> + <interface_ref>if3</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>NormalItemPreproc</name> + <key>agent.hostmetadata</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>2</parameter> + <parameter>3</parameter> + </parameters> + </step> + </preprocessing> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Agent ping (active)</name> + <type>ZABBIX_ACTIVE</type> + <key>agent.ping</key> + <tags> + <tag> + <tag>qw</tag> + <value>we</value> + </tag> + </tags> + <triggers> + <trigger> + <expression>now()>1 and baselinedev(/HostWithItems/agent.ping,1M:now/M,"h",2)=0</expression> + <name>TimeBasedAndOrdFuncTrigger</name> + </trigger> + </triggers> + </item> + <item> + <name>Agent version (passive)</name> + <key>agent.version</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Calculated</name> + <type>CALCULATED</type> + <key>calc</key> + <params>1+1</params> + <triggers> + <trigger> + <expression>last(/HostWithItems/calc)=1</expression> + <name>DepTrigger</name> + <priority>DISASTER</priority> + <manual_close>YES</manual_close> + <dependencies> + <dependency> + <name>SimpleTrigger</name> + <expression>last(/HostWithItems/calc)=1</expression> + </dependency> + </dependencies> + </trigger> + <trigger> + <expression>last(/HostWithItems/calc)=1</expression> + <name>SimpleTrigger</name> + <event_name>SimpleTriggerEvent</event_name> + <priority>WARNING</priority> + <manual_close>YES</manual_close> + <tags> + <tag> + <tag>aae</tag> + <value>bbeq</value> + </tag> + </tags> + </trigger> + <trigger> + <expression>last(/HostWithItems/calc)=2</expression> + <name>SimpleTrigger2</name> + <event_name>SimpleTriggerEvent2</event_name> + <priority>DISASTER</priority> + <manual_close>YES</manual_close> + <tags> + <tag> + <tag>aae</tag> + <value>bxisxbe</value> + </tag> + </tags> + </trigger> + </triggers> + </item> + <item> + <name>CalculatedAsAggregated</name> + <type>CALCULATED</type> + <key>calc_as_aggr</key> + <params>sum(last_foreach(/*/agent.ping?[group="HG1"]))</params> + </item> + <item> + <name>CalculatedPreproc</name> + <type>CALCULATED</type> + <key>calc_preproc</key> + <params>1</params> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>994</parameter> + <parameter>995</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <name>ODBC monitor</name> + <type>ODBC</type> + <key>db.odbc.select[x,y,z]</key> + <params>select null;</params> + </item> + <item> + <name>Dependent item</name> + <type>DEPENDENT</type> + <key>depitem</key> + <delay>0</delay> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <name>DepItemOnCalcPreproc</name> + <type>DEPENDENT</type> + <key>depitem_calc_preproc</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>a</parameter> + <parameter>b</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <name>DepItemOnDepCalcItem</name> + <type>DEPENDENT</type> + <key>depitem_depitem</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>2</parameter> + <parameter>22</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_calc_preproc</key> + </master_item> + </item> + <item> + <name>DepItemOnNormalDepItem</name> + <type>DEPENDENT</type> + <key>depitem_depitem_normal</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>bb</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_normalitem</key> + </master_item> + </item> + <item> + <name>DepItemOnInternalItem</name> + <type>DEPENDENT</type> + <key>depitem_internal</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>992</parameter> + <parameter>993</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>zabbix[boottime]</key> + </master_item> + </item> + <item> + <name>DepItemOnNormalItem</name> + <type>DEPENDENT</type> + <key>depitem_normalitem</key> + <delay>0</delay> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>c</parameter> + <parameter>d</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.ping</key> + </master_item> + </item> + <item> + <name>DepItemOnInternalItemPreproc</name> + <type>DEPENDENT</type> + <key>depitem_normal_preproc</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>4</parameter> + <parameter>5</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.version</key> + </master_item> + </item> + <item> + <name>External check</name> + <type>EXTERNAL</type> + <key>extcheck</key> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>HTTP agent</name> + <type>HTTP_AGENT</type> + <key>httpagent</key> + <authtype>BASIC</authtype> + <username>qqqqqqqqqqqqq</username> + <password>wwwwwwwwww</password> + <interface_ref>if1</interface_ref> + <url>localhost</url> + <query_fields> + <query_field> + <name>a</name> + <value>b</value> + </query_field> + </query_fields> + <posts>test</posts> + <headers> + <header> + <name>x</name> + <value>y</value> + </header> + </headers> + <retrieve_mode>BOTH</retrieve_mode> + <output_format>JSON</output_format> + <allow_traps>YES</allow_traps> + </item> + <item> + <name>Simple check</name> + <type>SIMPLE</type> + <key>icmpping[127.1.0.1]</key> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>IPMI agent</name> + <type>IPMI</type> + <key>ipmi.get</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <ipmi_sensor>123</ipmi_sensor> + <interface_ref>if3</interface_ref> + </item> + <item> + <name>ItemPreproc</name> + <type>CALCULATED</type> + <key>preproc</key> + <params>1</params> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>.*</parameter> + <parameter>v</parameter> + </parameters> + <error_handler>CUSTOM_VALUE</error_handler> + <error_handler_params>fail</error_handler_params> + </step> + </preprocessing> + </item> + <item> + <name>Script</name> + <type>SCRIPT</type> + <key>script</key> + <params>return "1";</params> + <inventory_link>NAME</inventory_link> + <parameters> + <parameter> + <name>aaa</name> + <value>bbb</value> + </parameter> + </parameters> + </item> + <item> + <name>SNMP trap</name> + <type>SNMP_TRAP</type> + <key>snmptrap.fallback</key> + <delay>0</delay> + <interface_ref>if2</interface_ref> + </item> + <item> + <name>SNMP agent</name> + <type>SNMP_AGENT</type> + <snmp_oid>SNMPv2-MIB::sysContact.0</snmp_oid> + <key>snmp_test</key> + <interface_ref>if2</interface_ref> + </item> + <item> + <name>SSH agent</name> + <type>SSH</type> + <key>ssh.run[x,localhost]</key> + <params>echo</params> + <username>password</username> + <password>password</password> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Telnet agent</name> + <type>TELNET</type> + <key>telnet.run[a,localhost]</key> + <params>echo</params> + <username>username</username> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Zabbix trapper</name> + <type>TRAP</type> + <key>trap</key> + <delay>0</delay> + </item> + <item> + <name>delay_globmacro</name> + <key>vfs.file.get[/tmp/{$UU}]</key> + <delay>{$GLOBDELAY}</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Zabbix internal</name> + <type>INTERNAL</type> + <key>zabbix[boottime]</key> + </item> + </items> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithMacros</host> + <name>HostWithMacros</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.0.123</ip> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>item1</name> + <type>CALCULATED</type> + <key>itm</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <params>1</params> + <triggers> + <trigger> + <expression>bitlength(last(/HostWithMacros/itm))>bitlength({$HM1})</expression> + <name>trigger with macro</name> + </trigger> + </triggers> + </item> + <item> + <name>ItemWithGlobalAndHostMacro</name> + <key>sensor[{$UU},{$HM1}]</key> + <delay>{$GLOBDELAY}</delay> + <value_type>FLOAT</value_type> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>ItemWithMacro</name> + <key>vfs.file.get[/tmp/{$HM1}]</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <interface_ref>if1</interface_ref> + </item> + </items> + <macros> + <macro> + <macro>{$HM1}</macro> + <value>hm1</value> + </macro> + </macros> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithTags</host> + <name>HostWithTags</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <tags> + <tag> + <tag>aaa</tag> + <value>bbb</value> + </tag> + <tag> + <tag>ccc</tag> + <value>ddd</value> + </tag> + <tag> + <tag>macro</tag> + <value>{$MACRO}</value> + </tag> + </tags> + <macros> + <macro> + <macro>{$MACRO}</macro> + <value>macro</value> + </macro> + </macros> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithTemplate</host> + <name>HostWithTemplate</name> + <proxy> + <name>Proxy</name> + </proxy> + <templates> + <template> + <name>SampleTemplate</name> + </template> + </templates> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithWebScenario</host> + <name>HostWithWebScenario</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <items> + <item> + <name>DepItemOnWebScenario</name> + <type>DEPENDENT</type> + <key>dep_webscenario</key> + <delay>0</delay> + <master_item> + <key>web.test.in[WebScenario,,bps]</key> + </master_item> + </item> + </items> + <httptests> + <httptest> + <name>WebScenario</name> + <http_proxy>127.0.0.2</http_proxy> + <variables> + <variable> + <name>{a}</name> + <value>b</value> + </variable> + </variables> + <headers> + <header> + <name>c</name> + <value>d</value> + </header> + </headers> + <steps> + <step> + <name>Step1</name> + <url>localhost/aaa</url> + <query_fields> + <query_field> + <name>qwe</name> + <value>ert</value> + </query_field> + </query_fields> + <posts>asdf=zxcv</posts> + <variables> + <variable> + <name>{A}</name> + <value>{A}</value> + </variable> + </variables> + <headers> + <header> + <name>rtyu</name> + <value>ghjk</value> + </header> + </headers> + <retrieve_mode>BOTH</retrieve_mode> + <timeout>21s</timeout> + <required>pattern</required> + <status_codes>201</status_codes> + </step> + </steps> + </httptest> + </httptests> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithComprehensiveTemplate</host> + <name>HostWithComprehensiveTemplate</name> + <proxy> + <name>Proxy</name> + </proxy> + <templates> + <template> + <name>ComprehensiveTemplate</name> + </template> + </templates> + <groups> + <group> + <name>HG1/Subgroup</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.1.1</ip> + <interface_ref>if1</interface_ref> + </interface> + <interface> + <type>SNMP</type> + <ip>127.0.1.1</ip> + <port>161</port> + <details> + <community>{$SNMP_COMMUNITY}</community> + </details> + <interface_ref>if2</interface_ref> + </interface> + <interface> + <type>IPMI</type> + <ip>127.0.1.1</ip> + <port>623</port> + <interface_ref>if4</interface_ref> + </interface> + <interface> + <type>JMX</type> + <ip>127.0.1.1</ip> + <port>12345</port> + <interface_ref>if3</interface_ref> + </interface> + </interfaces> + <macros> + <macro> + <macro>{$HM1}</macro> + <value>hm1b</value> + </macro> + </macros> + <inventory_mode>AUTOMATIC</inventory_mode> + </host> + </hosts> +</zabbix_export> diff --git a/ui/tests/integration/data/confsync_proxy_hosts_updated.xml b/ui/tests/integration/data/confsync_proxy_hosts_updated.xml new file mode 100644 index 00000000000..c6658dab908 --- /dev/null +++ b/ui/tests/integration/data/confsync_proxy_hosts_updated.xml @@ -0,0 +1,995 @@ +<?xml version="1.0" encoding="UTF-8"?> +<zabbix_export> + <version>6.4</version> + <date>2022-09-12T13:52:17Z</date> + <host_groups> + <host_group> + <uuid>c9ad86935aa14454a99f3bb442dccb2c</uuid> + <name>HG1</name> + </host_group> + <host_group> + <uuid>9a4a9554205541f1bb119cf1cfa3dfd4</uuid> + <name>HG1/Subgroup</name> + </host_group> + </host_groups> + <hosts> + <host> + <host>Host1</host> + <name>Host1a</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host2</host> + <name>Host2a</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <type>SNMP</type> + <port>1611</port> + <details> + <community>public</community> + </details> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host3</host> + <name>Host3a</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <type>IPMI</type> + <port>624</port> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host4</host> + <name>Host4a</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>Host5</host> + <name>Host5a</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostInventory</host> + <name>HostInventorya</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory> + <type>bbbbbbbb</type> + <type_full>bbbbbbbb</type_full> + <name>bbbbbbbb</name> + <alias>bbbbbbbb</alias> + <os>bbbbbbbb</os> + <os_full>bbbbbbbb</os_full> + <os_short>bbbbbbbb</os_short> + <serialno_a>bbbbbbbb</serialno_a> + <serialno_b>bbbbbbbb</serialno_b> + <tag>bbbbbbbb</tag> + <asset_tag>bbbbbbbb</asset_tag> + <macaddress_a>bbbbbbbb</macaddress_a> + <macaddress_b>bbbbbbbb</macaddress_b> + <hardware>bbbbbbbb</hardware> + <hardware_full>bbbbbbbb</hardware_full> + <software>bbbbbbbb</software> + <software_full>bbbbbbbb</software_full> + <software_app_a>bbbbbbbb</software_app_a> + <software_app_b>bbbbbbbb</software_app_b> + <software_app_c>bbbbbbbb</software_app_c> + <software_app_d>bbbbbbbb</software_app_d> + <software_app_e>bbbbbbbb</software_app_e> + <contact>bbbbbbbb</contact> + <location>bbbbbbbb</location> + <location_lat>bbbbbbbb</location_lat> + <location_lon>bbbbbbbb</location_lon> + <notes>bbbbbbbb</notes> + <chassis>bbbbbbbb</chassis> + <model>bbbbbbbb</model> + <hw_arch>bbbbbbbb</hw_arch> + <vendor>bbbbbbbb</vendor> + <contract_number>bbbbbbbb</contract_number> + <installer_name>bbbbbbbb</installer_name> + <deployment_status>bbbbbbbb</deployment_status> + <url_a>bbbbbbbb</url_a> + <url_b>bbbbbbbb</url_b> + <url_c>bbbbbbbb</url_c> + <host_networks>bbbbbbbb</host_networks> + <host_netmask>bbbbbbbb</host_netmask> + <host_router>bbbbbbbb</host_router> + <oob_ip>bbbbbbbb</oob_ip> + <oob_netmask>bbbbbbbb</oob_netmask> + <oob_router>bbbbbbbb</oob_router> + <date_hw_purchase>bbbbbbbb</date_hw_purchase> + <date_hw_install>bbbbbbbbbbbbbbbb</date_hw_install> + <date_hw_expiry>bbbbbbbb</date_hw_expiry> + <date_hw_decomm>bbbbbbbb</date_hw_decomm> + <site_address_a>bbbbbbbb</site_address_a> + <site_address_b>bbbbbbbb</site_address_b> + <site_address_c>bbbbbbbb</site_address_c> + <site_city>bbbbbbbb</site_city> + <site_state>bbbbbbbb</site_state> + <site_country>bbbbbbbb</site_country> + <site_zip>bbbbbbbb</site_zip> + <site_rack>bbbbbbbb</site_rack> + <site_notes>bbbbbbbb</site_notes> + <poc_1_name>bbbbbbbb</poc_1_name> + <poc_1_email>bbbbbbbb</poc_1_email> + <poc_1_phone_a>bbbbbbbb</poc_1_phone_a> + <poc_1_phone_b>bbbbbbbb</poc_1_phone_b> + <poc_1_cell>bbbbbbbb</poc_1_cell> + <poc_1_screen>bbbbbbbb</poc_1_screen> + <poc_1_notes>bbbbbbbb</poc_1_notes> + <poc_2_name>bbbbbbbb</poc_2_name> + <poc_2_email>bbbbbbbb</poc_2_email> + <poc_2_phone_a>bbbbbbbb</poc_2_phone_a> + <poc_2_phone_b>bbbbbbbb</poc_2_phone_b> + <poc_2_cell>bbbbbbbb</poc_2_cell> + <poc_2_screen>bbbbbbbb</poc_2_screen> + <poc_2_notes>bbbbbbbb</poc_2_notes> + </inventory> + </host> + <host> + <host>HostInventoryAutomatic</host> + <name>HostInventoryAutomatica</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.0.230</ip> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>Hostname1</name> + <key>agent.hostname</key> + <trends>0</trends> + <delay>25s</delay> + <value_type>CHAR</value_type> + <inventory_link>NAME</inventory_link> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Chassis1</name> + <key>system.hw.chassis[model]</key> + <trends>0</trends> + <delay>25s</delay> + <value_type>CHAR</value_type> + <inventory_link>HARDWARE_FULL</inventory_link> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Uname1</name> + <key>system.uname</key> + <trends>0</trends> + <delay>25s</delay> + <value_type>CHAR</value_type> + <inventory_link>OS</inventory_link> + <interface_ref>if1</interface_ref> + </item> + </items> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostMultilevelTmpl</host> + <name>HostMultilevelTmpla</name> + <proxy> + <name>Proxy</name> + </proxy> + <templates> + <template> + <name>bbbtmpl</name> + </template> + </templates> + <groups> + <group> + <name>HG1/Subgroup</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.0.152</ip> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>ItemWithMultilevelMacros11</name> + <key>vfs.dir.count[/tmp/{$UU},{$CHLDTMPLMACRO},{$PRNTTMPLMACRO}]</key> + <delay>{$PRNTTMPLMACRO}</delay> + <interface_ref>if1</interface_ref> + </item> + </items> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithDiscovery</host> + <name>HostWithDiscoverya</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <discovery_rules> + <discovery_rule> + <name>DiscoveryRule</name> + <type>SCRIPT</type> + <key>dcrule</key> + <delay>25s</delay> + <params>return "";</params> + <filter> + <conditions> + <condition> + <macro>{#X}</macro> + <value>YA</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + <item_prototypes> + <item_prototype> + <name>ItemProto1</name> + <type>CALCULATED</type> + <key>proto[{#X}]</key> + <params>1</params> + <trigger_prototypes> + <trigger_prototype> + <expression>last(/HostWithDiscovery/proto[{#X}])=2</expression> + <name>TriggerPrototype</name> + <priority>HIGH</priority> + <manual_close>YES</manual_close> + </trigger_prototype> + </trigger_prototypes> + </item_prototype> + </item_prototypes> + <host_prototypes> + <host_prototype> + <host>{#X}.HostPrototype</host> + <name>{#X}.HostPrototype</name> + <inventory_mode>DISABLED</inventory_mode> + <group_links> + <group_link> + <group> + <name>HG1</name> + </group> + </group_link> + </group_links> + </host_prototype> + </host_prototypes> + <lld_macro_paths> + <lld_macro_path> + <lld_macro>{#X}</lld_macro> + <path>$.b</path> + </lld_macro_path> + </lld_macro_paths> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>c</parameter> + <parameter>d</parameter> + </parameters> + </step> + </preprocessing> + <overrides> + <override> + <name>Override</name> + <step>1</step> + <stop>STOP</stop> + <filter> + <conditions> + <condition> + <macro>{#S}</macro> + <value>SSS</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + <operations> + <operation> + <operationobject>ITEM_PROTOTYPE</operationobject> + <value>2</value> + <status>DISABLED</status> + <discover>NO_DISCOVER</discover> + </operation> + </operations> + </override> + </overrides> + </discovery_rule> + </discovery_rules> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithItems</host> + <name>HostWithItemsa</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <interface_ref>if1</interface_ref> + </interface> + <interface> + <type>SNMP</type> + <port>1611</port> + <details> + <community>{$SNMP_COMMUNITY}</community> + </details> + <interface_ref>if2</interface_ref> + </interface> + <interface> + <type>IPMI</type> + <port>1623</port> + <interface_ref>if3</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>NormalItemPreproc11</name> + <key>agent.hostmetadata</key> + <trends>0</trends> + <delay>20s</delay> + <value_type>CHAR</value_type> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>4</parameter> + </parameters> + </step> + </preprocessing> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Agent ping (active)1</name> + <type>ZABBIX_ACTIVE</type> + <key>agent.ping</key> + <delay>20s</delay> + <tags> + <tag> + <tag>qw</tag> + <value>w1e</value> + </tag> + </tags> + <triggers> + <trigger> + <expression>now()>2 and baselinedev(/HostWithItems/agent.ping,1M:now/M,"h",3)=0</expression> + <name>TimeBasedAndOrdFuncTrigger</name> + <priority>HIGH</priority> + <description>HIGH</description> + </trigger> + </triggers> + </item> + <item> + <name>Agent version (1passive)</name> + <key>agent.version</key> + <delay>20s</delay> + <trends>0</trends> + <value_type>CHAR</value_type> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>alculated1</name> + <type>CALCULATED</type> + <key>calc</key> + <params>1+1+1</params> + <triggers> + <trigger> + <expression>last(/HostWithItems/calc)=2</expression> + <name>DepTrigger</name> + <priority>HIGH</priority> + <manual_close>YES</manual_close> + <description>HIGH</description> + <dependencies> + <dependency> + <name>SimpleTrigger2</name> + <expression>last(/HostWithItems/calc)=22</expression> + </dependency> + </dependencies> + </trigger> + <trigger> + <expression>last(/HostWithItems/calc)=2</expression> + <name>SimpleTrigger</name> + <event_name>SimpleTriggerEvent</event_name> + <priority>DISASTER</priority> + <manual_close>YES</manual_close> + <description>HIGH</description> + <tags> + <tag> + <tag>aae</tag> + <value>bbeq1</value> + </tag> + </tags> + </trigger> + <trigger> + <expression>last(/HostWithItems/calc)=22</expression> + <name>SimpleTrigger2</name> + <event_name>SimpleTriggerEvent2</event_name> + <priority>WARNING</priority> + <manual_close>YES</manual_close> + <description>HIGH</description> + <tags> + <tag> + <tag>aae1</tag> + <value>bxisxbe1</value> + </tag> + </tags> + </trigger> + </triggers> + </item> + <item> + <name>CalculatedAsAggregated1</name> + <type>CALCULATED</type> + <key>calc_as_aggr</key> + <params>sum(last_foreach(/*/agent.version?[group="HG1"]))</params> + </item> + <item> + <name>CalculatedPreproc1</name> + <type>CALCULATED</type> + <key>calc_preproc</key> + <params>1</params> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>4</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <name>ODBC monito1r</name> + <type>ODBC</type> + <key>db.odbc.select[x,y,z]</key> + <params>select null from dual;</params> + </item> + <item> + <name>Dependent item1</name> + <type>DEPENDENT</type> + <key>depitem</key> + <delay>10s</delay> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <name>DepItemOnCalcPreproc1</name> + <type>DEPENDENT</type> + <key>depitem_calc_preproc</key> + <delay>10s</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>ab</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <name>DepItemOnDepCalcItem1</name> + <type>DEPENDENT</type> + <key>depitem_depitem</key> + <delay>10s</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>322</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_calc_preproc</key> + </master_item> + </item> + <item> + <name>DepItemOnNormalDepItem1</name> + <type>DEPENDENT</type> + <key>depitem_depitem_normal</key> + <delay>10s</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>bab</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_normalitem</key> + </master_item> + </item> + <item> + <name>Zabbix internal1</name> + <type>INTERNAL</type> + <key>zabbix[boottime]</key> + </item> + <item> + <name>DepItemOnInternalItem1</name> + <type>DEPENDENT</type> + <key>depitem_internal</key> + <delay>30s</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>1</parameter> + <parameter>2a</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>zabbix[boottime]</key> + </master_item> + </item> + <item> + <name>DepItemOnNormalItem1</name> + <type>DEPENDENT</type> + <key>depitem_normalitem</key> + <delay>30s</delay> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>cd</parameter> + <parameter>dd</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.ping</key> + </master_item> + </item> + <item> + <name>DepItemOnInternalItemPreproc1</name> + <type>DEPENDENT</type> + <key>depitem_normal_preproc</key> + <delay>10s</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>41</parameter> + <parameter>51</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.version</key> + </master_item> + </item> + <item> + <name>External check1</name> + <type>EXTERNAL</type> + <key>extcheck</key> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>HTTP agent1</name> + <type>HTTP_AGENT</type> + <key>httpagent</key> + <authtype>BASIC</authtype> + <username>qqqqqqqqqqqqq</username> + <password>wwwwwwwwww</password> + <interface_ref>if1</interface_ref> + <url>localhost</url> + <query_fields> + <query_field> + <name>a</name> + <value>ba</value> + </query_field> + </query_fields> + <posts>test</posts> + <headers> + <header> + <name>x</name> + <value>yq</value> + </header> + </headers> + <retrieve_mode>BOTH</retrieve_mode> + <output_format>JSON</output_format> + <allow_traps>YES</allow_traps> + </item> + <item> + <name>Simple chec1k</name> + <type>SIMPLE</type> + <key>icmpping[127.1.0.1]</key> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>IPMI agent1</name> + <type>IPMI</type> + <key>ipmi.get</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <ipmi_sensor>1234</ipmi_sensor> + <interface_ref>if3</interface_ref> + </item> + <item> + <name>ItemPreproc1</name> + <type>CALCULATED</type> + <key>preproc</key> + <params>1</params> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>.*</parameter> + <parameter>vvv</parameter> + </parameters> + <error_handler>CUSTOM_VALUE</error_handler> + <error_handler_params>fail</error_handler_params> + </step> + </preprocessing> + </item> + <item> + <name>Script1</name> + <type>SCRIPT</type> + <key>script</key> + <params>return "1";</params> + <inventory_link>HARDWARE</inventory_link> + <parameters> + <parameter> + <name>aaa</name> + <value>bbbf</value> + </parameter> + </parameters> + </item> + <item> + <name>SNMP trap1</name> + <type>SNMP_TRAP</type> + <key>snmptrap.fallback</key> + <delay>10s</delay> + <interface_ref>if2</interface_ref> + </item> + <item> + <name>SNMP agent1</name> + <type>SNMP_AGENT</type> + <snmp_oid>SNMPv2-MIB::sysContact.0</snmp_oid> + <key>snmp_test</key> + <interface_ref>if2</interface_ref> + </item> + <item> + <name>SSH agent1</name> + <type>SSH</type> + <key>ssh.run[x,localhost]</key> + <params>echo</params> + <username>username</username> + <password>password1</password> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Telnet agent1</name> + <type>TELNET</type> + <key>telnet.run[a,localhost]</key> + <params>echo</params> + <username>use1rname</username> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>Zabbix trapper1</name> + <type>TRAP</type> + <key>trap</key> + <delay>10s</delay> + </item> + <item> + <name>delay_globmacro11</name> + <key>vfs.file.get[/tmp/{$UU}]</key> + <delay>{$GLOBDELAY}</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + <interface_ref>if1</interface_ref> + </item> + </items> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithMacros</host> + <name>HostWithMacrosa</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.0.223</ip> + <interface_ref>if1</interface_ref> + </interface> + </interfaces> + <items> + <item> + <name>item11</name> + <type>CALCULATED</type> + <key>itm</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <params>1</params> + <triggers> + <trigger> + <expression>bytelength(last(/HostWithMacros/itm))>bytelength({$HM1})</expression> + <name>trigger with macro</name> + <description>HIGH</description> + </trigger> + </triggers> + </item> + <item> + <name>ItemWithGlobalAndHostMacro11</name> + <key>sensor[{$UU},{$HM1}]</key> + <delay>{$GLOBDELAY}</delay> + <value_type>FLOAT</value_type> + <interface_ref>if1</interface_ref> + </item> + <item> + <name>ItemWithMacro1</name> + <key>vfs.file.get[/tmp/{$HM1}]</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <interface_ref>if1</interface_ref> + </item> + </items> + <macros> + <macro> + <macro>{$HM1}</macro> + <value>hm1a</value> + </macro> + </macros> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithTags</host> + <name>HostWithTagsa</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <tags> + <tag> + <tag>aaa</tag> + <value>bbba</value> + </tag> + <tag> + <tag>ccc</tag> + <value>dadd</value> + </tag> + <tag> + <tag>macro</tag> + <value>{$MACRO}</value> + </tag> + </tags> + <macros> + <macro> + <macro>{$MACRO}</macro> + <value>macroa</value> + </macro> + </macros> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithTemplate</host> + <name>HostWithTemplatea</name> + <proxy> + <name>Proxy</name> + </proxy> + <templates> + <template> + <name>SampleTemplate</name> + </template> + </templates> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithWebScenario</host> + <name>HostWithWebScenarioa</name> + <proxy> + <name>Proxy</name> + </proxy> + <groups> + <group> + <name>HG1</name> + </group> + </groups> + <items> + <item> + <name>DepItemOnWebScenario11</name> + <type>DEPENDENT</type> + <key>dep_webscenario</key> + <delay>20s</delay> + <master_item> + <key>web.test.in[WebScenario,,bps]</key> + </master_item> + </item> + </items> + <httptests> + <httptest> + <name>WebScenario</name> + <http_proxy>127.0.0.33</http_proxy> + <variables> + <variable> + <name>{a}</name> + <value>ba</value> + </variable> + </variables> + <headers> + <header> + <name>c</name> + <value>de</value> + </header> + </headers> + <steps> + <step> + <name>Step1</name> + <url>localhost/aaaa</url> + <query_fields> + <query_field> + <name>qwea</name> + <value>erta</value> + </query_field> + </query_fields> + <posts>asdf=zxcv</posts> + <variables> + <variable> + <name>{A}</name> + <value>{A}</value> + </variable> + </variables> + <headers> + <header> + <name>rtyau</name> + <value>ghajk</value> + </header> + </headers> + <retrieve_mode>BOTH</retrieve_mode> + <timeout>22s</timeout> + <required>pattern</required> + <status_codes>201</status_codes> + </step> + </steps> + </httptest> + </httptests> + <inventory_mode>DISABLED</inventory_mode> + </host> + <host> + <host>HostWithComprehensiveTemplate</host> + <name>HostWithComprehensiveTemplate1</name> + <proxy> + <name>Proxy</name> + </proxy> + <templates> + <template> + <name>ComprehensiveTemplate</name> + </template> + </templates> + <groups> + <group> + <name>HG1/Subgroup</name> + </group> + </groups> + <interfaces> + <interface> + <ip>127.0.1.1</ip> + <interface_ref>if1</interface_ref> + </interface> + <interface> + <type>SNMP</type> + <ip>127.0.1.3</ip> + <port>161</port> + <details> + <community>{$SNMP_COMMUNITY}</community> + </details> + <interface_ref>if2</interface_ref> + </interface> + <interface> + <type>IPMI</type> + <ip>127.0.1.1</ip> + <port>623</port> + <interface_ref>if4</interface_ref> + </interface> + <interface> + <type>JMX</type> + <ip>127.0.1.1</ip> + <port>12345</port> + <interface_ref>if3</interface_ref> + </interface> + </interfaces> + <macros> + <macro> + <macro>{$HM1}</macro> + <value>hm1b</value> + </macro> + </macros> + <inventory_mode>DISABLED</inventory_mode> + </host> + </hosts> +</zabbix_export> diff --git a/ui/tests/integration/data/confsync_proxy_tmpl.xml b/ui/tests/integration/data/confsync_proxy_tmpl.xml new file mode 100644 index 00000000000..e7b67fb5c71 --- /dev/null +++ b/ui/tests/integration/data/confsync_proxy_tmpl.xml @@ -0,0 +1,682 @@ +<?xml version="1.0" encoding="UTF-8"?> +<zabbix_export> + <version>6.4</version> + <date>2022-09-12T13:32:57Z</date> + <template_groups> + <template_group> + <uuid>bb17447fffe04b7784ddbd77b209c05a</uuid> + <name>TmplTests</name> + </template_group> + </template_groups> + <templates> + <template> + <uuid>17ecce4a1f2b4d739586ad1d6e717812</uuid> + <template>bbbtmpl</template> + <name>bbbtmpl</name> + <templates> + <template> + <name>SampleTemplate</name> + </template> + </templates> + <groups> + <group> + <name>TmplTests</name> + </group> + </groups> + <macros> + <macro> + <macro>{$CHLDTMPLMACRO}</macro> + <value>1</value> + </macro> + </macros> + </template> + <template> + <uuid>501966b8aa284d1caf393a02bb81d535</uuid> + <template>SampleTemplate</template> + <name>aaatmpl</name> + <groups> + <group> + <name>TmplTests</name> + </group> + </groups> + <items> + <item> + <uuid>de72d3b5a20f4e82ba3cab29ebd02d4d</uuid> + <name>TemplateItem</name> + <type>TRAP</type> + <key>tmpltrap</key> + <delay>0</delay> + <triggers> + <trigger> + <uuid>72c4555ac57c4daf94ccf1d1178d56fb</uuid> + <expression>last(/SampleTemplate/tmpltrap)=2</expression> + <name>TemplateTrigger</name> + <priority>HIGH</priority> + <tags> + <tag> + <tag>eee</tag> + <value>fff</value> + </tag> + </tags> + </trigger> + </triggers> + </item> + </items> + <discovery_rules> + <discovery_rule> + <uuid>4537d1d93224423489130a2785f57ae8</uuid> + <name>DiscoveryRule</name> + <type>SCRIPT</type> + <key>discrule</key> + <params>return "";</params> + <filter> + <conditions> + <condition> + <macro>{#LLDMACRO}</macro> + <value>W</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + <item_prototypes> + <item_prototype> + <uuid>f988e57fcdc541668c3c32919d3cfa60</uuid> + <name>DepItemProtoDependsOnNormalItem</name> + <type>DEPENDENT</type> + <key>depitemproto_deponnormal[{#LLDMACRO}]</key> + <delay>0</delay> + <master_item> + <key>tmpltrap</key> + </master_item> + <trigger_prototypes> + <trigger_prototype> + <uuid>ebc83aff113846518d3e1c88532274e1</uuid> + <expression>last(/SampleTemplate/depitemproto_deponnormal[{#LLDMACRO}])=0</expression> + <name>proto_dep {#LLDMACRO}</name> + <dependencies> + <dependency> + <name>proto {#LLDMACRO}</name> + <expression>last(/SampleTemplate/depitemproto_deponnormal[{#LLDMACRO}])=1</expression> + </dependency> + </dependencies> + <tags> + <tag> + <tag>xxx</tag> + <value>yyyy</value> + </tag> + </tags> + </trigger_prototype> + <trigger_prototype> + <uuid>6032b6444698467c8f41587858f089e5</uuid> + <expression>last(/SampleTemplate/depitemproto_deponnormal[{#LLDMACRO}])=1</expression> + <name>proto {#LLDMACRO}</name> + <tags> + <tag> + <tag>AAA</tag> + <value>bbb</value> + </tag> + <tag> + <tag>CCC</tag> + <value>ddd</value> + </tag> + </tags> + </trigger_prototype> + </trigger_prototypes> + </item_prototype> + </item_prototypes> + <lld_macro_paths> + <lld_macro_path> + <lld_macro>{#LLDMACRO}</lld_macro> + <path>$.macro</path> + </lld_macro_path> + </lld_macro_paths> + <overrides> + <override> + <name>OverrideA</name> + <step>1</step> + <filter> + <conditions> + <condition> + <macro>{#LLDMACRO}</macro> + <value>q</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + </override> + </overrides> + </discovery_rule> + </discovery_rules> + <httptests> + <httptest> + <uuid>d3f36682c20947cf910e733d8af93c95</uuid> + <name>WebScenTmpl</name> + <steps> + <step> + <name>StepWSTmpl</name> + <url>localhost</url> + </step> + </steps> + </httptest> + </httptests> + <macros> + <macro> + <macro>{$PRNTTMPLMACRO}</macro> + <value>2</value> + </macro> + </macros> + </template> + <template> + <uuid>efd071ed46cb4eaa84405d6469428910</uuid> + <template>ComprehensiveTemplate</template> + <name>ComprehensiveTemplate</name> + <groups> + <group> + <name>TmplTests</name> + </group> + </groups> + <items> + <item> + <uuid>9a1082526795476ab429acd9caafc920</uuid> + <name>NormalItemPreproc1</name> + <key>agent.hostmetadata</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>4</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <uuid>79a3b0eca3764c64abc7c53b83c0ce83</uuid> + <name>Hostname1</name> + <key>agent.hostname</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>NAME</inventory_link> + </item> + <item> + <uuid>ca3303d4b06a4d05915bf4a6785962cb</uuid> + <name>Agent ping (active)1</name> + <type>ZABBIX_ACTIVE</type> + <key>agent.ping</key> + <tags> + <tag> + <tag>qw</tag> + <value>w1e</value> + </tag> + </tags> + <triggers> + <trigger> + <uuid>02f89248506b4288b90646576e5d3e5f</uuid> + <expression>now()>1 and baselinedev(/ComprehensiveTemplate/agent.ping,1M:now/M,"h",2)=0</expression> + <name>TimeBasedAndOrdFuncTrigger1</name> + </trigger> + </triggers> + </item> + <item> + <uuid>1b74d86537414efe8dee3c05442aff2c</uuid> + <name>Agent version (passive)1</name> + <key>agent.version</key> + <trends>0</trends> + <value_type>CHAR</value_type> + </item> + <item> + <uuid>79a349483aae4d01915d0d307191dd56</uuid> + <name>Calculated1</name> + <type>CALCULATED</type> + <key>calc</key> + <params>1+1+1</params> + <triggers> + <trigger> + <uuid>d6edfd2d79874f9db4cfefe3065ea13e</uuid> + <expression>last(/ComprehensiveTemplate/calc)=1</expression> + <name>DepTrigger1</name> + <priority>DISASTER</priority> + <manual_close>YES</manual_close> + <dependencies> + <dependency> + <name>SimpleTrigger1</name> + <expression>last(/ComprehensiveTemplate/calc)=1</expression> + </dependency> + </dependencies> + </trigger> + <trigger> + <uuid>a82242bc84594586843847afe5296adb</uuid> + <expression>last(/ComprehensiveTemplate/calc)=1</expression> + <name>SimpleTrigger1</name> + <event_name>SimpleTriggerEvent</event_name> + <priority>WARNING</priority> + <manual_close>YES</manual_close> + <tags> + <tag> + <tag>aae</tag> + <value>bbeq</value> + </tag> + </tags> + </trigger> + <trigger> + <uuid>29f384f401b643d7b6889324470783ab</uuid> + <expression>last(/ComprehensiveTemplate/calc)=2</expression> + <name>SimpleTrigger21</name> + <event_name>SimpleTriggerEvent2</event_name> + <priority>DISASTER</priority> + <manual_close>YES</manual_close> + <tags> + <tag> + <tag>aae</tag> + <value>bxisxbe</value> + </tag> + </tags> + </trigger> + </triggers> + </item> + <item> + <uuid>16e297773b8d48958ebd4da74918687c</uuid> + <name>CalculatedItemPreprocStepTest1</name> + <type>CALCULATED</type> + <key>calculateditempreprocsteptest</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <params>1+1</params> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>.*</parameter> + <parameter>x</parameter> + </parameters> + </step> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>1</parameter> + <parameter>2</parameter> + </parameters> + </step> + <step> + <type>TRIM</type> + <parameters> + <parameter>abc</parameter> + </parameters> + </step> + <step> + <type>RTRIM</type> + <parameters> + <parameter>bbb</parameter> + </parameters> + </step> + <step> + <type>LTRIM</type> + <parameters> + <parameter>ccc</parameter> + </parameters> + </step> + <step> + <type>MATCHES_REGEX</type> + <parameters> + <parameter>.*x</parameter> + </parameters> + </step> + <step> + <type>DISCARD_UNCHANGED</type> + <parameters> + <parameter/> + </parameters> + </step> + <step> + <type>CSV_TO_JSON</type> + <parameters> + <parameter/> + <parameter/> + <parameter>1</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <uuid>34693044a4b84f269f829c92b8e6888f</uuid> + <name>CalculatedAsAggregated1</name> + <type>CALCULATED</type> + <key>calc_as_aggr</key> + <params>sum(last_foreach(/*/agent.version?[group="HG1"]))</params> + </item> + <item> + <uuid>489114fec8b44645b96b9c463ea54f22</uuid> + <name>CalculatedPreproc1</name> + <type>CALCULATED</type> + <key>calc_preproc</key> + <params>1</params> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>4</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <uuid>de2c2812f00240ec84359fb3c0165ff6</uuid> + <name>ODBC monitor1</name> + <type>ODBC</type> + <key>db.odbc.select[x,y,z]</key> + <params>select null from dual;</params> + </item> + <item> + <uuid>2012d2c4562340d990eebfac680cc1da</uuid> + <name>Dependent item1</name> + <type>DEPENDENT</type> + <key>depitem</key> + <delay>0</delay> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <uuid>d8def5fedd5a42a7b9a910c805a56899</uuid> + <name>DepItemOnCalcPreproc1</name> + <type>DEPENDENT</type> + <key>depitem_calc_preproc</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>ab</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <uuid>10741348d10842d5a2888c7c3ebe4063</uuid> + <name>DepItemOnDepCalcItem1</name> + <type>DEPENDENT</type> + <key>depitem_depitem</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>322</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_calc_preproc</key> + </master_item> + </item> + <item> + <uuid>d3e8a08190584da2a79f0c2c665a62ee</uuid> + <name>DepItemOnNormalDepItem1</name> + <type>DEPENDENT</type> + <key>depitem_depitem_normal</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>bab</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_normalitem</key> + </master_item> + </item> + <item> + <uuid>fd462776884943c08b6998bff03d5267</uuid> + <name>DepItemOnInternalItem1</name> + <type>DEPENDENT</type> + <key>depitem_internal</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>1</parameter> + <parameter>2a</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>zabbix[boottime]</key> + </master_item> + </item> + <item> + <uuid>a1baaaa5e7af48578a749c5380426ed6</uuid> + <name>DepItemOnNormalItem1</name> + <type>DEPENDENT</type> + <key>depitem_normalitem</key> + <delay>0</delay> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>cd</parameter> + <parameter>dd</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.ping</key> + </master_item> + </item> + <item> + <uuid>0a65fd6e155747ad9768e1c48c874264</uuid> + <name>DepItemOnInternalItemPreproc1</name> + <type>DEPENDENT</type> + <key>depitem_normal_preproc</key> + <delay>0</delay> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>41</parameter> + <parameter>51</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.version</key> + </master_item> + </item> + <item> + <uuid>e2b844f2d30440ef88deff5f3a596e1b</uuid> + <name>External check1</name> + <type>EXTERNAL</type> + <key>extcheck</key> + </item> + <item> + <uuid>2644c18c42864249a4be85871879af30</uuid> + <name>HTTP agent1</name> + <type>HTTP_AGENT</type> + <key>httpagent</key> + <authtype>BASIC</authtype> + <username>qqqqqqqqqqqqq</username> + <password>wwwwwwwwww</password> + <url>localhost</url> + <query_fields> + <query_field> + <name>a1</name> + <value>ba</value> + </query_field> + </query_fields> + <posts>test</posts> + <headers> + <header> + <name>x1</name> + <value>yq</value> + </header> + </headers> + <retrieve_mode>BOTH</retrieve_mode> + <output_format>JSON</output_format> + <allow_traps>YES</allow_traps> + </item> + <item> + <uuid>352e9f1baba8491f9fcf4e0e8d968f4d</uuid> + <name>Simple check1</name> + <type>SIMPLE</type> + <key>icmpping[127.0.0.1]</key> + </item> + <item> + <uuid>f219f82b5f2f41d0a72f718684476638</uuid> + <name>IPMI agent1</name> + <type>IPMI</type> + <key>ipmi.get</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <ipmi_sensor>1234</ipmi_sensor> + </item> + <item> + <uuid>5184862f271d4f8ebec44ef6526c1da1</uuid> + <name>item11</name> + <type>CALCULATED</type> + <key>itm</key> + <trends>0</trends> + <value_type>TEXT</value_type> + <params>1</params> + <triggers> + <trigger> + <uuid>3d12940891624ea38571bde3202bc728</uuid> + <expression>bitlength(last(/ComprehensiveTemplate/itm))>bitlength({$HM1})</expression> + <name>trigger with macro1</name> + </trigger> + </triggers> + </item> + <item> + <uuid>3ce4f0ce210148cdb778a05e00bbdc81</uuid> + <name>ItemPreproc1</name> + <type>CALCULATED</type> + <key>preproc</key> + <params>1</params> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>.*</parameter> + <parameter>vvv</parameter> + </parameters> + <error_handler>CUSTOM_VALUE</error_handler> + <error_handler_params>fail</error_handler_params> + </step> + </preprocessing> + </item> + <item> + <uuid>74db5c8a26b447468c2f2590af135878</uuid> + <name>Script1</name> + <type>SCRIPT</type> + <key>script</key> + <params>return "1";</params> + <inventory_link>HARDWARE</inventory_link> + <parameters> + <parameter> + <name>aaa1</name> + <value>bbbf</value> + </parameter> + </parameters> + </item> + <item> + <uuid>d94160c34be4455bba660b1b18c0fb0e</uuid> + <name>ItemWithGlobalAndHostMacro1</name> + <key>sensor[{$UU},{$HM1}]</key> + <delay>{$GLOBDELAY}</delay> + <value_type>FLOAT</value_type> + </item> + <item> + <uuid>5861cb498c044908a7aa5b225500ba3d</uuid> + <name>SNMP trap1</name> + <type>SNMP_TRAP</type> + <key>snmptrap.fallback</key> + <delay>10s</delay> + </item> + <item> + <uuid>0106d4d9fba64066a66fbfe2d2340602</uuid> + <name>SNMP agent1</name> + <type>SNMP_AGENT</type> + <snmp_oid>SNMPv2-MIB::sysContact.0</snmp_oid> + <key>snmp_test</key> + </item> + <item> + <uuid>49db5d3e8da84948a543801129a84b99</uuid> + <name>SSH agent1</name> + <type>SSH</type> + <key>ssh.run[x,localhost]</key> + <params>echo</params> + <username>username</username> + <password>password1</password> + </item> + <item> + <uuid>74939b6a93294881ac5ec83d885920c9</uuid> + <name>Chassis1</name> + <key>system.hw.chassis[model]</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>HARDWARE_FULL</inventory_link> + </item> + <item> + <uuid>8d311f6a4fb44a4ab325600539f8398e</uuid> + <name>Uname1</name> + <key>system.uname</key> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>OS</inventory_link> + </item> + <item> + <uuid>dca59a5058074e9f96a3d81f973bba75</uuid> + <name>Telnet agent1</name> + <type>TELNET</type> + <key>telnet.run[a,localhost]</key> + <params>echo</params> + <username>use1rname</username> + </item> + <item> + <uuid>aaaff64eee7e47589a6b6a329a1060a3</uuid> + <name>Zabbix trapper1</name> + <type>TRAP</type> + <key>trap</key> + <delay>0</delay> + </item> + <item> + <uuid>a1dfb8d4a8004159979dff4f884f5d89</uuid> + <name>ItemWithMultilevelMacros1</name> + <key>vfs.dir.count[/tmp/{$UU},{$CHLDTMPLMACRO},{$PRNTTMPLMACRO}]</key> + <delay>{$PRNTTMPLMACRO}</delay> + </item> + <item> + <uuid>381db19a280a4c27a1ad86693ea535bc</uuid> + <name>ItemWithMacro1</name> + <key>vfs.file.get[/tmp/{$HM1}]</key> + <trends>0</trends> + <value_type>TEXT</value_type> + </item> + <item> + <uuid>ec8e28d9728f4418af7847db9ce17612</uuid> + <name>delay_globmacro1</name> + <key>vfs.file.get[/tmp/{$UU}]</key> + <delay>{$GLOBDELAY}</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + </item> + <item> + <uuid>2a562bcf814343afb9c5cc4e9619e307</uuid> + <name>Zabbix internal1</name> + <type>INTERNAL</type> + <key>zabbix[boottime]</key> + </item> + </items> + </template> + </templates> +</zabbix_export> diff --git a/ui/tests/integration/data/confsync_proxy_tmpl_updated.xml b/ui/tests/integration/data/confsync_proxy_tmpl_updated.xml new file mode 100644 index 00000000000..9397219894b --- /dev/null +++ b/ui/tests/integration/data/confsync_proxy_tmpl_updated.xml @@ -0,0 +1,718 @@ +<?xml version="1.0" encoding="UTF-8"?> +<zabbix_export> + <version>6.4</version> + <date>2022-09-12T13:32:57Z</date> + <template_groups> + <template_group> + <uuid>bb17447fffe04b7784ddbd77b209c05a</uuid> + <name>TmplTests</name> + </template_group> + </template_groups> + <templates> + <template> + <uuid>beae65b7da0a4106bb34b9fc5d39120e</uuid> + <template>bbbtmpl</template> + <name>bbbtmpl</name> + <templates> + <template> + <name>SampleTemplate</name> + </template> + </templates> + <groups> + <group> + <name>TmplTests</name> + </group> + </groups> + <macros> + <macro> + <macro>{$CHLDTMPLMACRO}</macro> + <value>1</value> + </macro> + </macros> + </template> + <template> + <uuid>02988c606ac84654beb66617b9d7a80c</uuid> + <template>SampleTemplate</template> + <name>aaatmpl</name> + <groups> + <group> + <name>TmplTests</name> + </group> + </groups> + <items> + <item> + <uuid>9a443737fdc84f9a8305294ccb8c1ce9</uuid> + <name>TemplateItem</name> + <type>TRAP</type> + <key>tmpltrap</key> + <delay>10s</delay> + <triggers> + <trigger> + <uuid>677b5052252d423491ec680c7b1b32e5</uuid> + <expression>last(/SampleTemplate/tmpltrap)=3</expression> + <name>TemplateTrigger</name> + <priority>HIGH</priority> + <tags> + <tag> + <tag>eee</tag> + <value>faff</value> + </tag> + </tags> + </trigger> + </triggers> + </item> + </items> + <discovery_rules> + <discovery_rule> + <uuid>0c03a20de6f144d68bd48855e59fb32e</uuid> + <name>DiscoveryRule</name> + <type>SCRIPT</type> + <key>discrule</key> + <params>return "";</params> + <filter> + <conditions> + <condition> + <macro>{#LLDMACRO}</macro> + <value>WA</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + <item_prototypes> + <item_prototype> + <uuid>4d34d26d2480480c862261b1b9e9d99d</uuid> + <name>DepItemProtoDependsOnNormalItem1</name> + <type>DEPENDENT</type> + <key>depitemproto_deponnormal[{#LLDMACRO}]</key> + <delay>10s</delay> + <master_item> + <key>tmpltrap</key> + </master_item> + <trigger_prototypes> + <trigger_prototype> + <uuid>c64594a285b64df79b137eeaec10e52b</uuid> + <expression>last(/SampleTemplate/depitemproto_deponnormal[{#LLDMACRO}])=10</expression> + <name>proto_dep {#LLDMACRO}</name> + <dependencies> + <dependency> + <name>proto {#LLDMACRO}</name> + <expression>last(/SampleTemplate/depitemproto_deponnormal[{#LLDMACRO}])=110</expression> + </dependency> + </dependencies> + <tags> + <tag> + <tag>xxx</tag> + <value>yyy1y</value> + </tag> + </tags> + </trigger_prototype> + <trigger_prototype> + <uuid>1f2fbda374544b0cb77869c6f1d88314</uuid> + <expression>last(/SampleTemplate/depitemproto_deponnormal[{#LLDMACRO}])=10</expression> + <name>proto {#LLDMACRO}</name> + <tags> + <tag> + <tag>AAA</tag> + <value>bb1b</value> + </tag> + <tag> + <tag>CCC</tag> + <value>dda1d</value> + </tag> + </tags> + </trigger_prototype> + </trigger_prototypes> + </item_prototype> + </item_prototypes> + <lld_macro_paths> + <lld_macro_path> + <lld_macro>{#LLDMACRO}</lld_macro> + <path>$.macro</path> + </lld_macro_path> + </lld_macro_paths> + <overrides> + <override> + <name>OverrideA</name> + <step>1</step> + <filter> + <conditions> + <condition> + <macro>{#LLDMACRO}</macro> + <value>q1</value> + <formulaid>A</formulaid> + </condition> + </conditions> + </filter> + </override> + </overrides> + </discovery_rule> + </discovery_rules> + <httptests> + <httptest> + <uuid>14b0dc4f96ac43ceafafa7ef817ef4d6</uuid> + <name>WebScenTmpl</name> + <delay>2m</delay> + <steps> + <step> + <name>StepWSTmpl</name> + <url>localhost/zabbix</url> + </step> + </steps> + </httptest> + </httptests> + <macros> + <macro> + <macro>{$PRNTTMPLMACRO}</macro> + <value>22</value> + </macro> + </macros> + </template> + <template> + <uuid>efd071ed46cb4eaa84405d6469428910</uuid> + <template>ComprehensiveTemplate</template> + <name>ComprehensiveTemplate</name> + <groups> + <group> + <name>TmplTests</name> + </group> + </groups> + <items> + <item> + <uuid>9a1082526795476ab429acd9caafc920</uuid> + <name>NormalItemPreproc1</name> + <key>agent.hostmetadata</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>CHAR</value_type> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>4</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <uuid>79a3b0eca3764c64abc7c53b83c0ce83</uuid> + <name>Hostname1</name> + <key>agent.hostname</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>NAME</inventory_link> + </item> + <item> + <uuid>ca3303d4b06a4d05915bf4a6785962cb</uuid> + <name>Agent ping (active)1q</name> + <type>ZABBIX_ACTIVE</type> + <key>agent.ping</key> + <delay>23s</delay> + <tags> + <tag> + <tag>qw</tag> + <value>w1e</value> + </tag> + </tags> + <triggers> + <trigger> + <uuid>02f89248506b4288b90646576e5d3e5f</uuid> + <expression>now()>1 and baselinedev(/ComprehensiveTemplate/agent.ping,1M:now/M,"h",2)=22</expression> + <name>TimeBasedAndOrdFuncTrigger1</name> + <priority>HIGH</priority> + </trigger> + </triggers> + </item> + <item> + <uuid>1b74d86537414efe8dee3c05442aff2c</uuid> + <name>Agent version (passive)1q</name> + <key>agent.version</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>CHAR</value_type> + </item> + <item> + <uuid>79a349483aae4d01915d0d307191dd56</uuid> + <name>Calculated1q</name> + <type>CALCULATED</type> + <key>calc</key> + <delay>23s</delay> + <params>1+1+1</params> + <triggers> + <trigger> + <uuid>d6edfd2d79874f9db4cfefe3065ea13e</uuid> + <expression>last(/ComprehensiveTemplate/calc)=1</expression> + <name>DepTrigger1</name> + <priority>HIGH</priority> + <manual_close>YES</manual_close> + <dependencies> + <dependency> + <name>SimpleTrigger1</name> + <expression>last(/ComprehensiveTemplate/calc)=1</expression> + </dependency> + </dependencies> + </trigger> + <trigger> + <uuid>a82242bc84594586843847afe5296adb</uuid> + <expression>last(/ComprehensiveTemplate/calc)=1</expression> + <name>SimpleTrigger1</name> + <event_name>SimpleTriggerEvent</event_name> + <priority>HIGH</priority> + <manual_close>YES</manual_close> + <tags> + <tag> + <tag>aae</tag> + <value>bbeq</value> + </tag> + </tags> + </trigger> + <trigger> + <uuid>29f384f401b643d7b6889324470783ab</uuid> + <expression>last(/ComprehensiveTemplate/calc)=22</expression> + <name>SimpleTrigger21</name> + <event_name>SimpleTriggerEvent2</event_name> + <priority>HIGH</priority> + <manual_close>YES</manual_close> + <tags> + <tag> + <tag>aae</tag> + <value>bxisxbe</value> + </tag> + </tags> + </trigger> + </triggers> + </item> + <item> + <uuid>16e297773b8d48958ebd4da74918687c</uuid> + <name>CalculatedItemPreprocStepTest1</name> + <type>CALCULATED</type> + <key>calculateditempreprocsteptest</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + <params>1+1</params> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>.*</parameter> + <parameter>x</parameter> + </parameters> + </step> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>1</parameter> + <parameter>2</parameter> + </parameters> + </step> + <step> + <type>TRIM</type> + <parameters> + <parameter>abc</parameter> + </parameters> + </step> + <step> + <type>RTRIM</type> + <parameters> + <parameter>bbb</parameter> + </parameters> + </step> + <step> + <type>LTRIM</type> + <parameters> + <parameter>ccc</parameter> + </parameters> + </step> + <step> + <type>MATCHES_REGEX</type> + <parameters> + <parameter>.*x</parameter> + </parameters> + </step> + <step> + <type>DISCARD_UNCHANGED</type> + <parameters> + <parameter/> + </parameters> + </step> + <step> + <type>CSV_TO_JSON</type> + <parameters> + <parameter/> + <parameter/> + <parameter>1</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <uuid>34693044a4b84f269f829c92b8e6888f</uuid> + <name>CalculatedAsAggregated1</name> + <type>CALCULATED</type> + <key>calc_as_aggr</key> + <delay>23s</delay> + <params>sum(last_foreach(/*/agent.version?[group="HG1"]))</params> + </item> + <item> + <uuid>489114fec8b44645b96b9c463ea54f22</uuid> + <name>CalculatedPreproc1</name> + <type>CALCULATED</type> + <key>calc_preproc</key> + <delay>23s</delay> + <params>1</params> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>4</parameter> + </parameters> + </step> + </preprocessing> + </item> + <item> + <uuid>de2c2812f00240ec84359fb3c0165ff6</uuid> + <name>ODBC monitor1</name> + <type>ODBC</type> + <key>db.odbc.select[x,y,z]</key> + <delay>23s</delay> + <params>select null from dual;</params> + </item> + <item> + <uuid>2012d2c4562340d990eebfac680cc1da</uuid> + <name>Dependent item1</name> + <type>DEPENDENT</type> + <key>depitem</key> + <delay>0</delay> + <inventory_link>TYPE</inventory_link> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <uuid>d8def5fedd5a42a7b9a910c805a56899</uuid> + <name>DepItemOnCalcPreproc1</name> + <type>DEPENDENT</type> + <key>depitem_calc_preproc</key> + <delay>0</delay> + <inventory_link>ALIAS</inventory_link> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>ab</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>calc</key> + </master_item> + </item> + <item> + <uuid>10741348d10842d5a2888c7c3ebe4063</uuid> + <name>DepItemOnDepCalcItem1</name> + <type>DEPENDENT</type> + <key>depitem_depitem</key> + <delay>0</delay> + <inventory_link>TAG</inventory_link> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>3</parameter> + <parameter>322</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_calc_preproc</key> + </master_item> + </item> + <item> + <uuid>d3e8a08190584da2a79f0c2c665a62ee</uuid> + <name>DepItemOnNormalDepItem1</name> + <type>DEPENDENT</type> + <key>depitem_depitem_normal</key> + <delay>0</delay> + <inventory_link>SERIALNO_B</inventory_link> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>aa</parameter> + <parameter>bab</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>depitem_normalitem</key> + </master_item> + </item> + <item> + <uuid>fd462776884943c08b6998bff03d5267</uuid> + <name>DepItemOnInternalItem1</name> + <type>DEPENDENT</type> + <key>depitem_internal</key> + <delay>0</delay> + <inventory_link>MACADDRESS_B</inventory_link> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>1</parameter> + <parameter>2a</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>zabbix[boottime]</key> + </master_item> + </item> + <item> + <uuid>a1baaaa5e7af48578a749c5380426ed6</uuid> + <name>DepItemOnNormalItem1</name> + <type>DEPENDENT</type> + <key>depitem_normalitem</key> + <delay>0</delay> + <inventory_link>SOFTWARE_APP_E</inventory_link> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>cd</parameter> + <parameter>dd</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.ping</key> + </master_item> + </item> + <item> + <uuid>0a65fd6e155747ad9768e1c48c874264</uuid> + <name>DepItemOnInternalItemPreproc1</name> + <type>DEPENDENT</type> + <key>depitem_normal_preproc</key> + <delay>0</delay> + <inventory_link>SERIALNO_A</inventory_link> + <preprocessing> + <step> + <type>STR_REPLACE</type> + <parameters> + <parameter>41</parameter> + <parameter>51</parameter> + </parameters> + </step> + </preprocessing> + <master_item> + <key>agent.version</key> + </master_item> + </item> + <item> + <uuid>e2b844f2d30440ef88deff5f3a596e1b</uuid> + <name>External check1</name> + <type>EXTERNAL</type> + <key>extcheck</key> + <delay>23s</delay> + </item> + <item> + <uuid>2644c18c42864249a4be85871879af30</uuid> + <name>HTTP agent1</name> + <type>HTTP_AGENT</type> + <key>httpagent</key> + <delay>23s</delay> + <authtype>BASIC</authtype> + <username>qqqqqqqqqqqqq</username> + <password>wwwwwwwwww</password> + <url>localhost</url> + <query_fields> + <query_field> + <name>a1</name> + <value>ba</value> + </query_field> + </query_fields> + <posts>test</posts> + <headers> + <header> + <name>x1</name> + <value>yq</value> + </header> + </headers> + <retrieve_mode>BOTH</retrieve_mode> + <output_format>JSON</output_format> + <allow_traps>YES</allow_traps> + </item> + <item> + <uuid>352e9f1baba8491f9fcf4e0e8d968f4d</uuid> + <name>Simple check1</name> + <type>SIMPLE</type> + <key>icmpping[127.0.0.1]</key> + <delay>23s</delay> + </item> + <item> + <uuid>f219f82b5f2f41d0a72f718684476638</uuid> + <name>IPMI agent1</name> + <type>IPMI</type> + <key>ipmi.get</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + <ipmi_sensor>1234</ipmi_sensor> + </item> + <item> + <uuid>5184862f271d4f8ebec44ef6526c1da1</uuid> + <name>item11</name> + <type>CALCULATED</type> + <key>itm</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + <params>1</params> + <triggers> + <trigger> + <uuid>3d12940891624ea38571bde3202bc728</uuid> + <expression>bitlength(last(/ComprehensiveTemplate/itm))>bytelength({$HM1})</expression> + <name>trigger with macro1</name> + <priority>HIGH</priority> + </trigger> + </triggers> + </item> + <item> + <uuid>3ce4f0ce210148cdb778a05e00bbdc81</uuid> + <name>ItemPreproc1</name> + <type>CALCULATED</type> + <key>preproc</key> + <delay>23s</delay> + <params>1</params> + <preprocessing> + <step> + <type>REGEX</type> + <parameters> + <parameter>.*</parameter> + <parameter>vvv</parameter> + </parameters> + <error_handler>CUSTOM_VALUE</error_handler> + <error_handler_params>fail</error_handler_params> + </step> + </preprocessing> + </item> + <item> + <uuid>74db5c8a26b447468c2f2590af135878</uuid> + <name>Script1</name> + <type>SCRIPT</type> + <key>script</key> + <delay>23s</delay> + <params>return "1";</params> + <inventory_link>HARDWARE</inventory_link> + <parameters> + <parameter> + <name>aaa1</name> + <value>bbbf</value> + </parameter> + </parameters> + </item> + <item> + <uuid>d94160c34be4455bba660b1b18c0fb0e</uuid> + <name>ItemWithGlobalAndHostMacro1</name> + <key>sensor[{$UU},{$HM1}]</key> + <delay>{$GLOBDELAY}</delay> + <value_type>FLOAT</value_type> + </item> + <item> + <uuid>5861cb498c044908a7aa5b225500ba3d</uuid> + <name>SNMP trap1</name> + <type>SNMP_TRAP</type> + <key>snmptrap.fallback</key> + <delay>0</delay> + <units>MB</units> + </item> + <item> + <uuid>0106d4d9fba64066a66fbfe2d2340602</uuid> + <name>SNMP agent1</name> + <type>SNMP_AGENT</type> + <snmp_oid>SNMPv2-MIB::sysContact.0</snmp_oid> + <key>snmp_test</key> + <delay>23s</delay> + </item> + <item> + <uuid>49db5d3e8da84948a543801129a84b99</uuid> + <name>SSH agent1</name> + <type>SSH</type> + <key>ssh.run[x,localhost]</key> + <delay>23s</delay> + <params>echo</params> + <username>username</username> + <password>password1</password> + </item> + <item> + <uuid>74939b6a93294881ac5ec83d885920c9</uuid> + <name>Chassis1</name> + <key>system.hw.chassis[model]</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>HARDWARE_FULL</inventory_link> + </item> + <item> + <uuid>8d311f6a4fb44a4ab325600539f8398e</uuid> + <name>Uname1</name> + <key>system.uname</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>CHAR</value_type> + <inventory_link>OS</inventory_link> + </item> + <item> + <uuid>dca59a5058074e9f96a3d81f973bba75</uuid> + <name>Telnet agent1</name> + <type>TELNET</type> + <key>telnet.run[a,localhost]</key> + <delay>23s</delay> + <params>echo</params> + <username>use1rname</username> + </item> + <item> + <uuid>aaaff64eee7e47589a6b6a329a1060a3</uuid> + <name>Zabbix trapper1</name> + <type>TRAP</type> + <key>trap</key> + <delay>0</delay> + <units>MB</units> + </item> + <item> + <uuid>a1dfb8d4a8004159979dff4f884f5d89</uuid> + <name>ItemWithMultilevelMacros1</name> + <key>vfs.dir.count[/{$UU},{$CHLDTMPLMACRO},{$PRNTTMPLMACRO}]</key> + <delay>{$PRNTTMPLMACRO}</delay> + <units>MB</units> + </item> + <item> + <uuid>381db19a280a4c27a1ad86693ea535bc</uuid> + <name>ItemWithMacro1</name> + <key>vfs.file.get[/tmp/{$HM1}]</key> + <delay>23s</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + </item> + <item> + <uuid>ec8e28d9728f4418af7847db9ce17612</uuid> + <name>delay_globmacro1</name> + <key>vfs.file.get[/{$UU}]</key> + <delay>{$GLOBDELAY}</delay> + <trends>0</trends> + <value_type>TEXT</value_type> + </item> + <item> + <uuid>2a562bcf814343afb9c5cc4e9619e307</uuid> + <name>Zabbix internal1</name> + <type>INTERNAL</type> + <key>zabbix[boottime]</key> + <delay>23s</delay> + </item> + </items> + </template> + </templates> +</zabbix_export> diff --git a/ui/tests/integration/testDataCollection.php b/ui/tests/integration/testDataCollection.php index b3b1db8e9bc..6f2fcbf9dff 100644 --- a/ui/tests/integration/testDataCollection.php +++ b/ui/tests/integration/testDataCollection.php @@ -339,4 +339,90 @@ class testDataCollection extends CIntegrationTest { $this->assertEquals('proxy_agent', $item['value']); } } + + /** + * Test incremental pre-processing manager cache refresh. + * + * @required-components server + */ + public function testDataCollection_preprocManagerCacheRefresh() { + $response = $this->call('host.create', [ + [ + 'host' => 'trapper_host', + 'interfaces' => [ + 'type' => 1, + 'main' => 1, + 'useip' => 1, + 'ip' => '127.0.0.1', + 'dns' => '', + 'port' => $this->getConfigurationValue(self::COMPONENT_AGENT, 'ListenPort') + ], + 'groups' => [['groupid' => 4]], + 'status' => HOST_STATUS_MONITORED + ] + ]); + $this->assertArrayHasKey('hostids', $response['result']); + $this->assertArrayHasKey(0, $response['result']['hostids']); + $hostid = $response['result']['hostids'][0]; + + $response = $this->call('item.create', [ + 'hostid' => $hostid, + 'name' => 'trap', + 'key_' => 'trap', + 'type' => ITEM_TYPE_TRAPPER, + 'value_type' => ITEM_VALUE_TYPE_UINT64, + 'preprocessing' => [[ + 'params' => '100', + 'type' => 1, + 'error_handler' => 1, + 'error_handler_params' => '' + ]] + ]); + $this->assertArrayHasKey('itemids', $response['result']); + $this->assertEquals(1, count($response['result']['itemids'])); + $itemid = $response['result']['itemids'][0]; + + $this->reloadConfigurationCache(self::COMPONENT_SERVER); + + $this->sendSenderValue('trapper_host', 'trap', 1, self::COMPONENT_SERVER); + + $response = $this->callUntilDataIsPresent('history.get', [ + 'sortfield' => 'clock', + 'sortorder' => 'DESC', + 'limit' => 1, + 'itemids' => [$itemid] + ], 60, 1); + $this->assertArrayHasKey('result', $response); + $this->assertEquals(1, count($response['result'])); + $this->assertArrayHasKey('value', $response['result'][0]); + $this->assertEquals(100, $response['result'][0]['value']); + + $response = $this->call('item.update', [ + 'itemid' => $itemid, + 'preprocessing' => [[ + 'params' => '200', + 'type' => 1, + 'error_handler' => 1, + 'error_handler_params' => '' + ]] + ]); + $this->assertArrayHasKey('itemids', $response['result']); + $this->assertEquals(1, count($response['result']['itemids'])); + + $this->reloadConfigurationCache(self::COMPONENT_SERVER); + $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "finished forced reloading of the configuration cache", true, 60, 1); + + $this->sendSenderValue('trapper_host', 'trap', 2, self::COMPONENT_SERVER); + + $response = $this->callUntilDataIsPresent('history.get', [ + 'sortfield' => 'clock', + 'sortorder' => 'DESC', + 'limit' => 1, + 'itemids' => [$itemid] + ], 60, 1); + $this->assertArrayHasKey('result', $response); + $this->assertEquals(1, count($response['result'])); + $this->assertArrayHasKey('value', $response['result'][0]); + $this->assertEquals(400, $response['result'][0]['value']); + } } diff --git a/ui/tests/integration/testProxyConfSync.php b/ui/tests/integration/testProxyConfSync.php new file mode 100644 index 00000000000..364d7f60401 --- /dev/null +++ b/ui/tests/integration/testProxyConfSync.php @@ -0,0 +1,1673 @@ +<?php +/* +** Zabbix +** Copyright (C) 2001-2022 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 + */ +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' => '13', + 'update' => '0', + 'delete' => '0' + ] + ], + [ + 'items' => + [ + 'insert' => '76', + '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' + ] + ] + ]; + + 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" => + "0", + "update" => + "2", + "delete" => + "0" + ] + ], + [ + "interfaces" => + [ + "insert" => + "0", + "update" => + "8", + "delete" => + "0" + ] + ], + [ + "items" => + [ + "insert" => + "0", + "update" => + "36", + "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" => + "1", + "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" => + "13" + ] + ], + [ + "items" => + [ + "insert" => + "0", + "update" => + "0", + "delete" => + "76" + ] + ], + [ + "template_items" => + [ + "insert" => + "0", + "update" => + "0", + "delete" => + "0" + ] + ], + [ + "prototype_items" => + [ + "insert" => + "0", + "update" => + "0", + "delete" => + "76" + ] + ], + [ + "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' + ] + ] + ]; + + private static $regexpid; + private static $vaultmacroid; + private static $secretmacroid; + + /** + * @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', [ + 'host' => 'Proxy', + 'status' => HOST_STATUS_PROXY_PASSIVE, + 'hosts' => [], + 'interface' => [ + "ip" => "127.0.0.1", + "dns" => "", + "useip" => "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' => 1, + '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('/DCsync_configuration.*\([0-9]+\/[0-9]+\/[0-9]+\)\.$/', $data); + + $sync_lines1 = preg_replace( + [ + "/^\s*[0-9]+:[0-9]+:[0-9]+\.[0-9]+ DCsync_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']); + } + + 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 + ] + + ] + ]); + } + + 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 + ]); + } + } + + /** + * @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 DCsync_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 DCsync_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' => true, + 'updateExisting' => true, + 'deleteMissing' => true + ], + 'templateLinkage' => [ + 'createMissing' => false + ] + ] + + ]); + + $this->updateGlobalMacro(); + $this->disableAllHosts(); + + self::startComponent(self::COMPONENT_SERVER); + $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of DCsync_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 DCsync_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; + } +} |