[ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'autoreg' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'autoreghost' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'hosts' => [ 'insert' => '15', 'update' => '0', 'delete' => '0' ] ], [ 'host_invent' => [ 'insert' => '3', 'update' => '0', 'delete' => '0' ] ], [ 'templates' => [ 'insert' => '4', 'update' => '0', 'delete' => '0' ] ], [ 'globmacros' => [ 'insert' => '3', 'update' => '0', 'delete' => '0' ] ], [ 'hostmacros' => [ 'insert' => '5', 'update' => '0', 'delete' => '0' ] ], [ 'interfaces' => [ 'insert' => '15', 'update' => '0', 'delete' => '0' ] ], /* Where the number 95 came from ? Need to go through the confsync_hosts.xml and confsync_tmpl.xml, count number of items, item prototypes and discovery rules for hosts and templates that get imported by those hosts. However, the following needs to be accounted: a) every httpstep in web scenarios have 6 hidden items b) item prototypes in discovery rules are ignored by configuration syncer (ZBX_FLAG_DISCOVERY_PROTOTYPE = 2) With that approach we get the following: 1) HostInventoryAutomatic -> 3 items 2) HostMultilevelTmpl -> 9 items, (1 items, also inherits bbbtmpl, which inherits 'SampleTemplate', which has 1 item, 1 item prototype (ignored as it is part of the discovery rule), 1 discovery rule, 1 httpstep(6 items))) 3) HostWithDiscovery -> 1 items (1 item prototype(ignored as it is part of the discovery rule), 1 discovery rule) 4) HostWithItems -> 28 items 5) HostWithMacros -> 3 items 6) HostWithTemplate -> 8 items (inherits 'SampleTemplate') 7) HostWithWebScenario -> 7 items (1 item + httpstep(6 items)) 8) HostWithComprehensiveTemplate -> 36 items (inherits 'Comprehensive Template') 3 + 9 + 1 + 28 + 3 + 8 + 7 + 36 = 95 */ [ 'items' => [ 'insert' => '95', 'update' => '0', 'delete' => '0' ] ], [ 'template_items' => [ 'insert' => '54', 'update' => '0', 'delete' => '0' ] ], [ 'prototype_items' => [ 'insert' => '5', 'update' => '0', 'delete' => '0' ] ], [ 'item_discovery' => [ 'insert' => '5', 'update' => '0', 'delete' => '0' ] ], [ 'triggers' => [ 'insert' => '28', 'update' => '0', 'delete' => '0' ] ], [ 'trigdeps' => [ 'insert' => '7', 'update' => '0', 'delete' => '0' ] ], [ 'trigtags' => [ 'insert' => '22', 'update' => '0', 'delete' => '0' ] ], [ 'hosttags' => [ 'insert' => '3', 'update' => '0', 'delete' => '0' ] ], [ 'itemtags' => [ 'insert' => '3', 'update' => '0', 'delete' => '0' ] ], [ 'functions' => [ 'insert' => '28', 'update' => '0', 'delete' => '0' ] ], [ 'expressions' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'actions' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'operations' => [ 'insert' => '0', 'update' => '1', 'delete' => '0' ] ], [ 'conditions' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'corr' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'corr_cond' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'corr_op' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'hgroups' => [ 'insert' => '16', 'update' => '0', 'delete' => '0' ] ], [ 'itempproc' => [ 'insert' => '44', 'update' => '0', 'delete' => '0' ] ], [ 'itemscriptparam' => [ 'insert' => '2', 'update' => '0', 'delete' => '0' ] ], [ 'maintenance' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'drules' => [ 'insert' => '1', 'update' => '0', 'delete' => '0' ] ], [ 'httptests' => [ 'insert' => '5', 'update' => '0', 'delete' => '0' ] ], [ 'connector' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'connector_tag' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'proxy' => [ 'insert' => '2', '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" => "14", "delete" => "0" ] ], [ "host_invent" => [ "insert" => "0", "update" => "1", "delete" => "0" ] ], [ "templates" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "globmacros" => [ "insert" => "0", "update" => "3", "delete" => "0" ] ], [ "hostmacros" => [ "insert" => "2", "update" => "2", "delete" => "2" ] ], [ "interfaces" => [ "insert" => "0", "update" => "9", "delete" => "0" ] ], [ "items" => [ "insert" => "0", "update" => "84", "delete" => "0" ] ], [ "template_items" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "prototype_items" => [ "insert" => "0", "update" => "5", "delete" => "0" ] ], [ "item_discovery" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "triggers" => [ "insert" => "9", "update" => "10", "delete" => "9" ] ], [ "trigdeps" => [ "insert" => "4", "update" => "0", "delete" => "4" ] ], [ "trigtags" => [ "insert" => "12", "update" => "0", "delete" => "12" ] ], [ "hosttags" => [ "insert" => "2", "update" => "0", "delete" => "2" ] ], [ "itemtags" => [ "insert" => "1", "update" => "0", "delete" => "1" ] ], [ "functions" => [ "insert" => "15", "update" => "0", "delete" => "15" ] ], [ "expressions" => [ "insert" => "1", "update" => "0", "delete" => "1" ] ], [ "actions" => [ "insert" => "0", "update" => "1", "delete" => "0" ] ], [ "operations" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "conditions" => [ "insert" => "0", "update" => "1", "delete" => "0" ] ], [ "corr" => [ "insert" => "0", "update" => "1", "delete" => "0" ] ], [ "corr_cond" => [ "insert" => "1", "update" => "0", "delete" => "1" ] ], [ "corr_op" => [ "insert" => "1", "update" => "0", "delete" => "1" ] ], [ "hgroups" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "itempproc" => [ "insert" => "0", "update" => "12", "delete" => "0" ] ], [ "itemscriptparam" => [ "insert" => "0", "update" => "1", "delete" => "0" ] ], [ "maintenance" => [ "insert" => "0", "update" => "1", "delete" => "0" ] ], [ "drules" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "httptests" => [ "insert" => "0", "update" => "5", "delete" => "0" ] ], [ 'connector' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'connector_tag' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'proxy' => [ 'insert' => '0', 'update' => '2', '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" => "19" ] ], [ "host_invent" => [ "insert" => "0", "update" => "0", "delete" => "3" ] ], [ "templates" => [ "insert" => "0", "update" => "0", "delete" => "4" ] ], [ "globmacros" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "hostmacros" => [ "insert" => "0", "update" => "0", "delete" => "5" ] ], [ "interfaces" => [ "insert" => "0", "update" => "0", "delete" => "15" ] ], [ "items" => [ "insert" => "0", "update" => "0", "delete" => "152" ] ], [ "template_items" => [ "insert" => "0", "update" => "0", "delete" => "54" ] ], [ "prototype_items" => [ "insert" => "0", "update" => "0", "delete" => "152" ] ], [ "item_discovery" => [ "insert" => "0", "update" => "0", "delete" => "5" ] ], [ "triggers" => [ "insert" => "0", "update" => "0", "delete" => "28" ] ], [ "trigdeps" => [ "insert" => "0", "update" => "0", "delete" => "7" ] ], [ "trigtags" => [ "insert" => "0", "update" => "0", "delete" => "22" ] ], [ "hosttags" => [ "insert" => "0", "update" => "0", "delete" => "3" ] ], [ "itemtags" => [ "insert" => "0", "update" => "0", "delete" => "3" ] ], [ "functions" => [ "insert" => "0", "update" => "0", "delete" => "28" ] ], [ "expressions" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ "actions" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ "operations" => [ "insert" => "0", "update" => "0", "delete" => "0" ] ], [ "conditions" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ "corr" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ "corr_cond" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ "corr_op" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ "hgroups" => [ "insert" => "0", "update" => "0", "delete" => "2" ] ], [ "itempproc" => [ "insert" => "0", "update" => "0", "delete" => "44" ] ], [ "itemscriptparam" => [ "insert" => "0", "update" => "0", "delete" => "2" ] ], [ "maintenance" => [ "insert" => "0", "update" => "0", "delete" => "1" ] ], [ 'drules' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'httptests' => [ 'insert' => '0', 'update' => '0', 'delete' => '5' ] ], [ 'connector' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'connector_tag' => [ 'insert' => '0', 'update' => '0', 'delete' => '0' ] ], [ 'proxy' => [ 'insert' => '0', 'update' => '0', 'delete' => '2' ] ] ]; private static $proxyid_active; private static $proxyid_passive; private static $actionid; private static $triggerid; private static $correlationid; private static $maintenanceid; private static $regexpid; private static $vaultmacroid; private static $secretmacroid; private static $tlshostid; /** * @inheritdoc */ public function prepareData() { return true; } /** * Component configuration provider for server related tests. * * @return array */ public function serverConfigurationProvider() { return [ self::COMPONENT_SERVER => [ 'LogFileSize' => 0, 'DebugLevel' => 5, 'Vault' => 'CyberArk', 'VaultURL' => 'https://127.0.0.1:1858' ] ]; } private function parseSyncResults() { $log = file_get_contents(self::getLogPath(self::COMPONENT_SERVER)); $data = explode("\n", $log); $sync_lines = preg_grep('/zbx_dc_sync_configuration.*\([0-9]+\/[0-9]+\/[0-9]+\)\.$/', $data); $sync_lines1 = preg_replace( [ "/^\s*[0-9]+:[0-9]+:[0-9]+\.[0-9]+ zbx_dc_sync_configuration\(\) /", "/\s+/", "/:sql:[0-9]+\.[0-9]+sync:[0-9]+\.[0-9]+sec/", "/:sql:[0-9]+\.[0-9]+sec/" ], "", $sync_lines ); $sync_lines2 = preg_replace( [ "/(\(\))|(\()/", "/\)\.|\./" ], [ ":", "" ], $sync_lines1 ); $results = []; foreach ($sync_lines2 as $v) { $o = explode(":", $v); $subject = $o[0]; $operations = explode("/", $o[1]); if (count($operations) < 3) { continue; } $pair = [ $subject => [ 'insert' => $operations[0], 'update' => $operations[1], 'delete' => $operations[2] ] ]; array_push($results, $pair); } return $results; } private function getStringPoolCount() { $log = file_get_contents(self::getLogPath(self::COMPONENT_SERVER)); preg_match('/zbx_dc_sync_configuration\(\)\s+strings\s+:\s*(\d+)/', $log, $result); return $result[1]; } 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 disableAllHosts() { $response = $this->call('host.get', [ 'output' => 'hostid', 'preservekeys' => true ]); $this->assertArrayHasKey('result', $response); $ids = array_keys($response['result']); if (empty($ids)) { return; } foreach ($ids as $hostid) { $response = $this->call('host.update', [ 'hostid' => $hostid, 'status' => 1 ]); } } private function createActions() { $response = $this->call('trigger.get', [ 'output' => 'triggerids', 'preservekeys' => true ]); $this->assertArrayHasKey('result', $response); self::$triggerid = array_key_first($response['result']); $response = $this->call('action.create', [ 'esc_period' => '1h', 'eventsource' => EVENT_SOURCE_TRIGGERS, 'status' => 0, 'filter' => [ 'conditions' => [ [ 'conditiontype' => CONDITION_TYPE_TRIGGER_NAME, 'operator' => CONDITION_OPERATOR_LIKE, 'value' => 'qqq' ] ], 'evaltype' => CONDITION_EVAL_TYPE_AND_OR ], 'name' => 'Trapper received 1 (problem) clone', 'operations' => [ [ 'esc_period' => 0, 'esc_step_from' => 1, 'esc_step_to' => 1, 'operationtype' => OPERATION_TYPE_MESSAGE, 'opmessage' => [ 'default_msg' => 1, 'mediatypeid' => 0 ], 'opmessage_grp' => [ ['usrgrpid' => 7] ] ] ], 'pause_suppressed' => 0, 'recovery_operations' => [ [ 'operationtype' => OPERATION_TYPE_MESSAGE, 'opmessage' => [ 'default_msg' => 1, 'mediatypeid' => 0 ], 'opmessage_grp' => [ ['usrgrpid' => 7] ] ] ] ]); $this->assertArrayHasKey('actionids', $response['result']); $this->assertEquals(1, count($response['result']['actionids'])); self::$actionid = $response['result']['actionids'][0]; } private function updateAction() { $response = $this->call('action.update', [ 'esc_period' => '5m', 'actionid' => self::$actionid, 'filter' => [ 'conditions' => [ [ 'conditiontype' => CONDITION_TYPE_TRIGGER_NAME, 'operator' => CONDITION_OPERATOR_NOT_LIKE, 'value' => 'qqq' ] ], 'evaltype' => CONDITION_EVAL_TYPE_OR ], 'operations' => [ [ 'esc_period' => 0, 'esc_step_from' => 1, 'esc_step_to' => 1, 'operationtype' => OPERATION_TYPE_MESSAGE, 'opmessage' => [ 'default_msg' => 0, 'mediatypeid' => 0, 'message' => '{SERVICE.NAME}|{SERVICE.TAGS}|{SERVICE.TAGSJSON}|{SERVICE.ROOTCAUSE}', 'subject' => 'Problem' ], 'opmessage_grp' => [['usrgrpid' => 7]] ] ] ]); $this->assertArrayHasKey('actionids', $response['result']); $this->assertArrayHasKey(0, $response['result']['actionids']); } private function createMaintenance() { $response = $this->call('host.get', [ 'output' => 'hostids', 'preservekeys' => true ]); $this->assertArrayHasKey('result', $response); $hostid = array_key_first($response['result']); $maint_start_tm = time(); $maint_end_tm = $maint_start_tm + 60 * 2; $response = $this->call('maintenance.create', [ 'name' => 'Test maintenance', 'hosts' => ['hostid' => $hostid], 'active_since' => $maint_start_tm, 'active_till' => $maint_end_tm, 'tags_evaltype' => MAINTENANCE_TAG_EVAL_TYPE_AND_OR, 'timeperiods' => [ 'timeperiod_type' => TIMEPERIOD_TYPE_ONETIME, 'period' => 300, 'start_date' => $maint_start_tm ] ]); $this->assertArrayHasKey('maintenanceids', $response['result']); $this->assertEquals(1, count($response['result']['maintenanceids'])); self::$maintenanceid = $response['result']['maintenanceids'][0]; } private function setupTlsForHost() { $response = $this->call('host.get', [ 'output' => 'hostids', 'filter' => [ 'host' => ['Host1'] ], 'preservekeys' => true ]); $this->assertArrayHasKey('result', $response); self::$tlshostid = array_key_first($response['result']); $response = $this->call('host.update', [ 'hostid' => self::$tlshostid, 'tls_connect' => HOST_ENCRYPTION_PSK, 'tls_accept' => HOST_ENCRYPTION_PSK | HOST_ENCRYPTION_CERTIFICATE, 'tls_issuer' => 'iss', 'tls_subject' => 'sub', 'tls_psk_identity' => '2790d1e1781449f8879714a21fb706f9f008910ccf6b7339bb1975bc33e0c449', 'tls_psk' => '1e07e499695b1c5f8fc1ccb5ee935240ae1b85d0ac0f821c7133aa17852bf7d8' ]); $this->assertArrayHasKey('hostids', $response['result']); $this->assertEquals(1, count($response['result']['hostids'])); } private function updateTlsForHost() { $response = $this->call('host.update', [ 'hostid' => self::$tlshostid, 'tls_connect' => HOST_ENCRYPTION_CERTIFICATE, 'tls_accept' => HOST_ENCRYPTION_CERTIFICATE, 'tls_issuer' => 'iss', 'tls_subject' => 'sub' ]); $this->assertArrayHasKey('hostids', $response['result']); $this->assertEquals(1, count($response['result']['hostids'])); } private function updateMaintenance() { $response = $this->call('maintenance.update', [ 'maintenanceid' => self::$maintenanceid, 'active_since' => time(), 'active_till' => time() + 86400 ]); $this->assertArrayHasKey('maintenanceids', $response['result']); $this->assertEquals(1, count($response['result']['maintenanceids'])); } private function createCorrelation() { $response = $this->call('correlation.create', [ 'name' => 'new corr', 'filter' => [ 'evaltype' => 0, 'conditions' => [[ 'type' => 1, 'tag' => 'ok' ]] ], 'operations' => [ ['type' => 0] ] ]); $this->assertArrayHasKey("correlationids", $response['result']); self::$correlationid = $response['result']['correlationids'][0]; } private function updateCorrelation() { $response = $this->call('correlation.update', [ 'correlationid' => self::$correlationid, 'name' => 'cr', 'filter' => [ 'evaltype' => 0, 'conditions' => [[ 'type' => 3, 'oldtag' => 'x', 'newtag' => 'y' ]] ], 'operations' => [ ['type' => 1] ] ]); $this->assertArrayHasKey("correlationids", $response['result']); } private function createRegexp() { $response = $this->call('regexp.create', [ 'name' => 'global regexp test', 'test_string' => '/boot', 'expressions' => [ [ 'expression' => '.*', 'expression_type' => EXPRESSION_TYPE_FALSE, 'case_sensitive' => 1 ] ] ]); $this->assertArrayHasKey("regexpids", $response['result']); self::$regexpid = $response['result']['regexpids'][0]; } private function updateRegexp() { $response = $this->call('regexp.update', [ 'regexpid' => self::$regexpid, 'test_string' => '/tmp', 'expressions' => [ [ 'expression' => '.*a', 'expression_type' => EXPRESSION_TYPE_TRUE, 'case_sensitive' => 1 ] ] ]); $this->assertArrayHasKey("regexpids", $response['result']); } private function createProxies() { $response = $this->call('proxy.create', [ 'name' => 'ProxyA', 'operating_mode' => PROXY_OPERATING_MODE_ACTIVE, 'allowed_addresses' => '10.0.2.15,zabbix.test', 'tls_connect' => HOST_ENCRYPTION_NONE, 'tls_accept' => HOST_ENCRYPTION_PSK | HOST_ENCRYPTION_CERTIFICATE, 'tls_issuer' => 'iss', 'tls_subject' => 'sub', 'tls_psk_identity' => '2790d1e1781449f8879714a21fb706f9f008910ccf6b7339bb1975bc33e0c449', 'tls_psk' => '1e07e499695b1c5f8fc1ccb5ee935240ae1b85d0ac0f821c7133aa17852bf7d8', 'hosts' => [] ]); $this->assertArrayHasKey("proxyids", $response['result']); self::$proxyid_active = $response['result']['proxyids'][0]; $response = $this->call('proxy.create', [ 'name' => 'ProxyP', 'operating_mode' => PROXY_OPERATING_MODE_PASSIVE, 'hosts' => [], 'address' => '127.0.0.1', 'port' => '10099', 'tls_connect' => HOST_ENCRYPTION_PSK, 'tls_accept' => HOST_ENCRYPTION_NONE, 'tls_psk_identity' => '2790d1e1781449f8879714a21fb706f9f008910ccf6b7339bb1975bc33e0c449', 'tls_psk' => '1e07e499695b1c5f8fc1ccb5ee935240ae1b85d0ac0f821c7133aa17852bf7d8' ]); $this->assertArrayHasKey('proxyids', $response['result']); self::$proxyid_passive = $response['result']['proxyids'][0]; } private function updateProxies() { $response = $this->call('proxy.update', [ 'proxyid' => self::$proxyid_active, 'allowed_addresses' => '127.9.9.9' ]); $this->assertArrayHasKey("proxyids", $response['result']); $response = $this->call('proxy.update', [ 'proxyid' => self::$proxyid_passive, 'name' => 'ProxyP1', 'address' => '127.1.30.2', 'port' => '10299' ]); $this->assertArrayHasKey('proxyids', $response['result']); } 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' => '11111595725ac58dd977beef14b97461a7c1045b9a1c923453302c5473193478' ]); $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 ] ] ]); } public function loadInitialConfiguration() { $this->createProxies(); $this->createCorrelation(); $this->createRegexp(); $this->createGlobalMacros(); $this->importTemplate('confsync_tmpl.xml'); $xml = file_get_contents('integration/data/confsync_hosts.xml'); $response = $this->call('configuration.import', [ 'format' => 'xml', 'source' => $xml, 'rules' => [ 'host_groups' => [ 'updateExisting' => true, 'createMissing' => true ], 'hosts' => [ 'updateExisting' => true, 'createMissing' => true ], 'valueMaps' => [ 'updateExisting' => true, 'createMissing' => true, 'deleteMissing' => false ], 'templateLinkage' => [ 'createMissing' => true, 'deleteMissing' => false ], 'items' => [ 'updateExisting' => true, 'createMissing' => true, 'deleteMissing' => false ], 'discoveryRules' => [ 'updateExisting' => true, 'createMissing' => true, 'deleteMissing' => false ], 'triggers' => [ 'updateExisting' => true, 'createMissing' => true, 'deleteMissing' => false ], 'graphs' => [ 'updateExisting' => true, 'createMissing' => true, 'deleteMissing' => false ], 'httptests' => [ 'updateExisting' => true, 'createMissing' => true, 'deleteMissing' => false ] ] ]); $this->createActions(); $this->createMaintenance(); $this->setupTlsForHost(); } /** */ public function testInitialConfSync_Insert() { $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->purgeExisting('action', 'actionids'); $this->purgeHostGroups(); $this->purgeGlobalMacros(); self::stopComponent(self::COMPONENT_SERVER); self::clearLog(self::COMPONENT_SERVER); $this->loadInitialConfiguration(); $this->disableAllHosts(); self::startComponent(self::COMPONENT_SERVER); $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1); $got = $this->parseSyncResults(); $this->assertEquals($this->expected_initial, $got); $this->purgeExisting('correlation', 'correlationids'); $this->purgeExisting('maintenance', 'maintenanceids'); $this->purgeExisting('host', 'hostids'); $this->purgeExisting('proxy', 'extend'); $this->purgeExisting('template', 'templateids'); $this->purgeExisting('item', 'itemids'); $this->purgeExisting('action', 'actionid'); $this->purgeExisting('trigger', 'triggerids'); $this->purgeExisting('regexp', 'extend'); $this->purgeHostGroups(); $this->purgeGlobalMacros(); self::clearLog(self::COMPONENT_SERVER); $this->reloadConfigurationCache(self::COMPONENT_SERVER); $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1); $stringpool_old = $this->getStringPoolCount(); self::stopComponent(self::COMPONENT_SERVER); self::clearLog(self::COMPONENT_SERVER); self::startComponent(self::COMPONENT_SERVER); $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1); $stringpool_new = $this->getStringPoolCount(); $this->assertEquals($stringpool_old, $stringpool_new); $this->loadInitialConfiguration(); $this->disableAllHosts(); return true; } public function testInitialConfSync_Update() { $this->updateProxies(); $this->updateCorrelation(); $this->updateMaintenance(); $this->updateRegexp(); $this->updateAutoregistration(); $this->importTemplateForUpdate('confsync_tmpl_updated.xml'); $xml = file_get_contents('integration/data/confsync_hosts_updated.xml'); $response = $this->call('configuration.import', [ 'format' => 'xml', 'source' => $xml, 'rules' => [ 'hosts' => [ 'createMissing' => false, 'updateExisting' => true ], 'items' => [ 'createMissing' => false, 'updateExisting' => true ], 'host_groups' => [ 'createMissing' => false, 'updateExisting' => true ], 'discoveryRules' => [ 'createMissing' => false, 'updateExisting' => true, 'deleteMissing' => false ], 'httptests' => [ 'createMissing' => false, 'updateExisting' => true, 'deleteMissing' => false ], 'triggers' => [ 'createMissing' => false, 'updateExisting' => true, 'deleteMissing' => false ], 'templateLinkage' => [ 'createMissing' => false ] ] ]); $this->updateGlobalMacro(); $this->updateAction(); $this->updateTlsForHost(); $this->clearLog(self::COMPONENT_SERVER); $this->reloadConfigurationCache(self::COMPONENT_SERVER); $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1); $got = $this->parseSyncResults(); $this->assertEquals($this->expected_update, $got); return true; } public function testInitialConfSync_Delete() { $this->purgeExisting('maintenance', 'maintenanceids'); $this->purgeExisting('host', 'hostids'); $this->purgeExisting('proxy', 'extend'); $this->purgeExisting('template', 'templateids'); $this->purgeExisting('correlation', 'correlationids'); $this->purgeExisting('regexp', 'extend'); $this->purgeExisting('action', 'actionids'); $this->purgeExisting('item', 'itemids'); $this->purgeHostGroups(); $this->clearLog(self::COMPONENT_SERVER); $this->reloadConfigurationCache(self::COMPONENT_SERVER); $this->waitForLogLineToBePresent(self::COMPONENT_SERVER, "End of zbx_dc_sync_configuration()", true, 30, 1); $got = $this->parseSyncResults(); $this->assertEquals($this->expected_delete, $got); self::stopComponent(self::COMPONENT_SERVER); self::clearLog(self::COMPONENT_SERVER); self::startComponent(self::COMPONENT_SERVER); return true; } }