summaryrefslogtreecommitdiffstats
path: root/test/php/library/Director/Import/HostSyncTest.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/php/library/Director/Import/HostSyncTest.php250
1 files changed, 250 insertions, 0 deletions
diff --git a/test/php/library/Director/Import/HostSyncTest.php b/test/php/library/Director/Import/HostSyncTest.php
new file mode 100644
index 0000000..eeee7a4
--- /dev/null
+++ b/test/php/library/Director/Import/HostSyncTest.php
@@ -0,0 +1,250 @@
+<?php
+
+namespace Tests\Icinga\Module\Director\IcingaConfig;
+
+use Icinga\Module\Director\Objects\IcingaHostGroup;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Test\SyncTest;
+
+class HostSyncTest extends SyncTest
+{
+ protected $objectType = 'host';
+
+ protected $keyColumn = 'host';
+
+ public function testSimpleSync()
+ {
+ $this->runImport(array(
+ array(
+ 'host' => 'SYNCTEST_simple',
+ 'address' => '127.0.0.1',
+ 'os' => 'Linux'
+ )
+ ));
+
+ $this->setUpProperty(array(
+ 'source_expression' => '${host}',
+ 'destination_field' => 'object_name',
+ 'priority' => 10,
+ ));
+ $this->setUpProperty(array(
+ 'source_expression' => '${address}',
+ 'destination_field' => 'address',
+ 'priority' => 11,
+ ));
+ $this->setUpProperty(array(
+ 'source_expression' => '${os}',
+ 'destination_field' => 'vars.os',
+ 'priority' => 12,
+ ));
+
+ $this->assertTrue($this->sync->hasModifications(), 'Should have modifications pending');
+ $this->assertGreaterThan(0, $this->sync->apply(), 'Should successfully apply at least 1 update');
+ $this->assertFalse($this->sync->hasModifications(), 'Should not have modifications pending after sync');
+ }
+
+ public function testSyncWithoutData()
+ {
+ $this->runImport(array());
+
+ $this->setUpProperty(array(
+ 'source_expression' => '${host}',
+ 'destination_field' => 'object_name',
+ 'priority' => 10,
+ ));
+
+ $this->assertFalse($this->sync->hasModifications(), 'Should not have modifications pending');
+ }
+
+ public function testSyncMultipleGroups()
+ {
+ $this->requireGroups(['SYNCTEST_groupa', 'SYNCTEST_groupb']);
+ $this->runImport([[
+ 'host' => 'SYNCTEST_groups1',
+ 'g1' => 'SYNCTEST_groupa',
+ 'g2' => 'SYNCTEST_groupb'
+ ], [
+ 'host' => 'SYNCTEST_groups2',
+ 'g1' => null,
+ 'g2' => 'SYNCTEST_groupb'
+ ]]);
+
+ $this->setUpProperty(array(
+ 'source_expression' => '${host}',
+ 'destination_field' => 'object_name',
+ 'priority' => 10,
+ ));
+ $this->setUpProperty(array(
+ 'source_expression' => '${g1}',
+ 'destination_field' => 'groups',
+ 'priority' => 12,
+ ));
+ $this->setUpProperty(array(
+ 'source_expression' => '${g2}',
+ 'destination_field' => 'groups',
+ 'priority' => 11,
+ ));
+
+ $this->assertTrue($this->sync->hasModifications(), 'Should have modifications pending');
+
+ $modifications = array();
+ /** @var IcingaObject $mod */
+ foreach ($this->sync->getExpectedModifications() as $mod) {
+ $name = $mod->object_name;
+ $modifications[$name] = $mod;
+
+ switch ($name) {
+ case 'SYNCTEST_groups1':
+ $this->assertEquals([
+ 'SYNCTEST_groupa',
+ 'SYNCTEST_groupb',
+ ], $mod->get('groups'));
+ break;
+ case 'SYNCTEST_groups2':
+ $this->assertEquals([
+ 'SYNCTEST_groupb',
+ ], $mod->get('groups'));
+ break;
+ }
+ }
+
+ $this->assertGreaterThan(0, $this->sync->apply(), 'Should successfully apply at least 1 update');
+ $this->assertFalse($this->sync->hasModifications(), 'Should not have modifications pending after sync');
+ }
+
+ public function testSyncFilteredData()
+ {
+ $this->runImport(array(
+ array(
+ 'host' => 'SYNCTEST_filtered_in',
+ 'address' => '127.0.0.1',
+ 'os' => 'Linux',
+ 'sync' => 'yes'
+ ),
+ array(
+ 'host' => 'SYNCTEST_filtered_out',
+ 'address' => '127.0.0.1',
+ 'os' => null,
+ 'sync' => 'no'
+ ),
+ array(
+ 'host' => 'SYNCTEST_filtered_in_unusedfield',
+ 'address' => '127.0.0.1',
+ 'os' => null,
+ 'sync' => 'no',
+ 'othersync' => '1'
+ ),
+ array(
+ 'host' => 'SYNCTEST_filtered_in_unusedfield_propfilter',
+ 'address' => '127.0.0.1',
+ 'os' => null,
+ 'magic' => '2',
+ 'sync' => 'no',
+ 'othersync' => '1'
+ )
+ ));
+
+ $this->rule->set('filter_expression', 'sync=yes|othersync=1');
+ $this->rule->store();
+
+ $this->setUpProperty(array(
+ 'source_expression' => '${host}',
+ 'destination_field' => 'object_name',
+ 'priority' => 10,
+ ));
+ $this->setUpProperty(array(
+ 'source_expression' => '${address}',
+ 'destination_field' => 'address',
+ 'priority' => 11,
+ ));
+ $this->setUpProperty(array(
+ 'source_expression' => 'test',
+ 'destination_field' => 'vars.magic',
+ 'filter_expression' => 'magic!=',
+ 'priority' => 12,
+ ));
+
+ $modifications = array();
+ /** @var IcingaObject $mod */
+ foreach ($this->sync->getExpectedModifications() as $mod) {
+ $name = $mod->object_name;
+ $modifications[$name] = $mod;
+
+ $this->assertEquals(
+ '127.0.0.1',
+ $mod->get('address'),
+ $name . ': address should not be synced'
+ );
+ $this->assertNull($mod->get('vars.os'), $name . ': vars.os should not be synced');
+
+ if ($name === 'SYNCTEST_filtered_in_unusedfield_propfilter') {
+ $this->assertEquals(
+ 'test',
+ $mod->get('vars.magic'),
+ $name . ': vars.magic should not be synced'
+ );
+ } else {
+ $this->assertNull($mod->get('vars.magic'), $name . ': vars.magic should not be synced');
+ }
+ }
+
+ $this->assertArrayHasKey(
+ 'SYNCTEST_filtered_in',
+ $modifications,
+ 'SYNCTEST_filtered_in should be modified'
+ );
+ $this->assertArrayNotHasKey(
+ 'SYNCTEST_filtered_out',
+ $modifications,
+ 'SYNCTEST_filtered_out should be synced'
+ );
+ $this->assertArrayHasKey(
+ 'SYNCTEST_filtered_in_unusedfield',
+ $modifications,
+ 'SYNCTEST_filtered_in_unusedfield should be modified'
+ );
+ $this->assertArrayHasKey(
+ 'SYNCTEST_filtered_in_unusedfield_propfilter',
+ $modifications,
+ 'SYNCTEST_filtered_in_unusedfield_propfilter should be modified'
+ );
+ }
+
+ /**
+ * @param $names
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\IcingaException
+ */
+ protected function requireGroups($names)
+ {
+ foreach ($names as $name) {
+ if (! IcingaHostGroup::exists($name, $this->getDb())) {
+ IcingaHostGroup::create([
+ 'object_name' => $name,
+ 'object_type' => 'object',
+ ], $this->getDb())->store();
+ }
+ }
+ }
+
+ /**
+ * @param $names
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\IcingaException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function removeGroups($names)
+ {
+ foreach ($names as $name) {
+ if (IcingaHostGroup::exists($name, $this->getDb())) {
+ IcingaHostGroup::load($name, $this->getDb())->delete();
+ }
+ }
+ }
+
+ public function tearDown()
+ {
+ $this->removeGroups(['SYNCTEST_groupa', 'SYNCTEST_groupb']);
+ parent::tearDown();
+ }
+}