icingadb-web/test/php/application/clicommands/MigrateCommandTest.php
2025-04-10 15:04:41 +02:00

1727 lines
70 KiB
PHP

<?php
/* Icinga DB Web | (c) 2023 Icinga GmbH | GPLv2 */
namespace Tests\Icinga\Module\Icingadb\Clicommands;
use Icinga\Application\Cli;
use Icinga\Application\Config;
use Icinga\Application\Modules\Manager;
use Icinga\Cli\Params;
use Icinga\Data\ConfigObject;
use Icinga\Exception\IcingaException;
use Icinga\Exception\MissingParameterException;
use Icinga\File\Storage\TemporaryLocalFileStorage;
use Icinga\Module\Icingadb\Clicommands\MigrateCommand;
use PHPUnit\Framework\TestCase;
class MigrateCommandTest extends TestCase
{
protected $config = [
'dashboards' => [
'initial' => [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'hosts.group_members' => [
'title' => 'Group Members',
'url' => 'monitoring/list/hosts?hostgroup_name=group1|hostgroup_name=%28group2%29'
],
'hosts.variables' => [
'title' => 'Host Variables',
'url' => 'monitoring/list/hosts?(_host_foo=bar&_host_bar=foo)|_host_rab=oof'
],
'hosts.wildcards' => [
'title' => 'Host Wildcards',
'url' => 'monitoring/list/hosts?host_name=%2Afoo%2A|host_name=%2Abar%2A'
. '&sort=host_severity&dir=asc&limit=25'
],
'hosts.encoded_params' => [
'title' => 'Host Encoded Params',
'url' => 'monitoring/list/hosts?host_name=%28foo%29&sort=_host_%28foo%29'
],
'icingadb' => [
'title' => 'Icinga DB'
],
'icingadb.no-wildcards' => [
'title' => 'No Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name=linux-hosts'
],
'icingadb.wildcards' => [
'title' => 'Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name=%2Alinux%2A'
],
'icingadb.also-wildcards' => [
'title' => 'Also Wildcards',
'url' => 'icingadb/hosts?host.name=%2Afoo%2A'
],
'icingadb.with-sort-and-limit' => [
'title' => 'With Sort And Limit',
'url' => 'icingadb/hosts?host.name=%2Afoo%2A|host.name=bar&sort=host.state.severity&limit=50'
],
'not-monitoring-or-icingadb' => [
'title' => 'Not Monitoring Or Icinga DB'
],
'not-monitoring-or-icingadb.something' => [
'title' => 'Something',
'url' => 'somewhere/something?foo=%2Abar%2A'
]
],
'expected' => [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
],
'hosts.group_members' => [
'title' => 'Group Members',
'url' => 'icingadb/hosts?hostgroup.name=group1|hostgroup.name=%28group2%29'
],
'hosts.variables' => [
'title' => 'Host Variables',
'url' => 'icingadb/hosts?(host.vars.foo=bar&host.vars.bar=foo)|host.vars.rab=oof'
],
'hosts.wildcards' => [
'title' => 'Host Wildcards',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A|host.name~%2Abar%2A'
. '&sort=host.state.severity%20asc&limit=25'
],
'hosts.encoded_params' => [
'title' => 'Host Encoded Params',
'url' => 'icingadb/hosts?host.name=%28foo%29&sort=host.vars.%28foo%29'
],
'icingadb' => [
'title' => 'Icinga DB'
],
'icingadb.no-wildcards' => [
'title' => 'No Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name=linux-hosts'
],
'icingadb.wildcards' => [
'title' => 'Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name~%2Alinux%2A'
],
'icingadb.also-wildcards' => [
'title' => 'Also Wildcards',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A'
],
'icingadb.with-sort-and-limit' => [
'title' => 'With Sort And Limit',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A|host.name=bar&sort=host.state.severity&limit=50'
],
'not-monitoring-or-icingadb' => [
'title' => 'Not Monitoring Or Icinga DB'
],
'not-monitoring-or-icingadb.something' => [
'title' => 'Something',
'url' => 'somewhere/something?foo=%2Abar%2A'
]
]
],
'menu-items' => [
'initial' => [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name=%2Afoo%2A'
]
],
'expected' => [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.state.is_problem=y'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A'
]
]
],
'shared-menu-items' => [
'initial' => [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo',
'owner' => 'test'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1',
'owner' => 'test'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name=%2Afoo%2A',
'owner' => 'test'
],
'other-monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1',
'owner' => 'not-test'
]
],
'expected' => [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo',
'owner' => 'test'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.state.is_problem=y',
'owner' => 'test'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A',
'owner' => 'test'
],
'other-monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1',
'owner' => 'not-test'
]
]
],
'host-actions' => [
'initial' => [
'hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A'
],
'hosts_encoded_params' => [
'type' => 'host-action',
'url' => 'monitoring/list/hosts?host_name=%28foo%29&sort=_host_%28foo%29',
'filter' => '_host_%28foo%29=bar'
]
],
'expected' => [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A'
],
'hosts_encoded_params' => [
'type' => 'icingadb-host-action',
'url' => 'icingadb/hosts?host.name=%28foo%29&sort=host.vars.%28foo%29',
'filter' => 'host.vars.%28foo%29=bar'
]
]
],
'icingadb-host-actions' => [
'initial' => [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name=%2Afoo%2A'
]
],
'expected' => [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A'
]
]
],
'service-actions' => [
'initial' => [
'services' => [
'type' => 'service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => '_service_foo=bar&_service_bar=%2Afoo%2A'
],
'services_encoded_params' => [
'type' => 'host-action',
'url' => 'monitoring/list/services?host_name=%28foo%29&sort=_host_%28foo%29',
'filter' => '_host_%28foo%29=bar'
]
],
'expected' => [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=bar&service.vars.bar~%2Afoo%2A'
],
'services_encoded_params' => [
'type' => 'icingadb-host-action',
'url' => 'icingadb/services?host.name=%28foo%29&sort=host.vars.%28foo%29',
'filter' => 'host.vars.%28foo%29=bar'
]
]
],
'icingadb-service-actions' => [
'initial' => [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=%2Abar%2A'
]
],
'expected' => [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo~%2Abar%2A'
]
]
],
'shared-host-actions' => [
'initial' => [
'shared-hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A',
'owner' => 'test'
],
'hosts_encoded_params' => [
'type' => 'host-action',
'url' => 'monitoring/list/hosts?host_name=%28foo%29&sort=_host_%28foo%29',
'filter' => '_host_%28foo%29=bar',
'owner' => 'test'
],
'other-hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A',
'owner' => 'not-test'
]
],
'expected' => [
'shared-hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A',
'owner' => 'test'
],
'hosts_encoded_params' => [
'type' => 'icingadb-host-action',
'url' => 'icingadb/hosts?host.name=%28foo%29&sort=host.vars.%28foo%29',
'filter' => 'host.vars.%28foo%29=bar',
'owner' => 'test'
]
]
],
'host-actions-legacy-macros' => [
'initial' => [
'hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$HOSTNAME$,$HOSTADDRESS$,$HOSTADDRESS6$',
'filter' => 'host_name=%2Afoo%2A'
]
],
'expected' => [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$,$host.address$,$host.address6$',
'filter' => 'host.name~%2Afoo%2A'
]
]
],
'service-actions-legacy-macros' => [
'initial' => [
'services' => [
'type' => 'service-action',
'url' => 'example.com/search?q=$SERVICEDESC$,$HOSTNAME$,$HOSTADDRESS$,$HOSTADDRESS6$',
'filter' => '_service_foo=bar&_service_bar=%2Afoo%2A'
]
],
'expected' => [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=bar&service.vars.bar~%2Afoo%2A'
]
]
],
'all-roles' => [
'initial' => [
'no-wildcards' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'wildcards' => [
'monitoring/filter/objects' => 'host_name=%2Afoo%2A|hostgroup_name=%2Afoo%2A'
],
'encoded_column' => [
'monitoring/filter/objects' => '_host_%28foo%29=bar'
],
'blacklist' => [
'monitoring/blacklist/properties' => 'host.vars.foo,service.vars.bar*,host.vars.a.**.d'
],
'full-access' => [
'permissions' => 'module/monitoring,monitoring/*'
],
'general-read-access' => [
'permissions' => 'module/monitoring'
],
'general-write-access' => [
'permissions' => 'module/monitoring,monitoring/command/*'
],
'full-fine-grained-access' => [
'permissions' => 'module/monitoring'
. ',monitoring/command/schedule-check'
. ',monitoring/command/acknowledge-problem'
. ',monitoring/command/remove-acknowledgement'
. ',monitoring/command/comment/add'
. ',monitoring/command/comment/delete'
. ',monitoring/command/downtime/schedule'
. ',monitoring/command/downtime/delete'
. ',monitoring/command/process-check-result'
. ',monitoring/command/feature/instance'
. ',monitoring/command/feature/object/active-checks'
. ',monitoring/command/feature/object/passive-checks'
. ',monitoring/command/feature/object/notifications'
. ',monitoring/command/feature/object/event-handler'
. ',monitoring/command/feature/object/flap-detection'
. ',monitoring/command/send-custom-notification'
],
'full-with-refusals' => [
'permissions' => 'module/monitoring,monitoring/command/*',
'refusals' => 'monitoring/command/downtime/*,monitoring/command/feature/instance'
],
'active-only' => [
'permissions' => 'module/monitoring,monitoring/command/schedule-check/active-only'
],
'no-monitoring-contacts' => [
'permissions' => 'module/monitoring,no-monitoring/contacts'
],
'reporting-only' => [
'permissions' => 'module/reporting'
],
'icingadb' => [
'icingadb/filter/objects' => 'host.name=%2Afoo%2A|hostgroup.name=%2Afoo%2A',
'icingadb/filter/services' => 'service.name=%2Abar%2A&service.vars.env=prod',
'icingadb/filter/hosts' => 'host.vars.env=%2Afoo%2A'
]
],
'expected' => [
'no-wildcards' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo',
'icingadb/filter/objects' => 'host.name=foo|hostgroup.name=foo'
],
'wildcards' => [
'monitoring/filter/objects' => 'host_name=%2Afoo%2A|hostgroup_name=%2Afoo%2A',
'icingadb/filter/objects' => 'host.name~%2Afoo%2A|hostgroup.name~%2Afoo%2A'
],
'encoded_column' => [
'monitoring/filter/objects' => '_host_%28foo%29=bar',
'icingadb/filter/objects' => 'host.vars.%28foo%29=bar'
],
'blacklist' => [
'monitoring/blacklist/properties' => 'host.vars.foo,service.vars.bar*,host.vars.a.**.d',
'icingadb/denylist/variables' => 'foo,bar*,a.*.d'
],
'full-access' => [
'permissions' => 'module/monitoring,monitoring/*'
],
'general-read-access' => [
'permissions' => 'module/monitoring'
],
'general-write-access' => [
'permissions' => 'module/monitoring,monitoring/command/*,icingadb/command/*'
],
'full-fine-grained-access' => [
'permissions' => 'module/monitoring'
. ',monitoring/command/schedule-check'
. ',icingadb/command/schedule-check'
. ',monitoring/command/acknowledge-problem'
. ',icingadb/command/acknowledge-problem'
. ',monitoring/command/remove-acknowledgement'
. ',icingadb/command/remove-acknowledgement'
. ',monitoring/command/comment/add'
. ',icingadb/command/comment/add'
. ',monitoring/command/comment/delete'
. ',icingadb/command/comment/delete'
. ',monitoring/command/downtime/schedule'
. ',icingadb/command/downtime/schedule'
. ',monitoring/command/downtime/delete'
. ',icingadb/command/downtime/delete'
. ',monitoring/command/process-check-result'
. ',icingadb/command/process-check-result'
. ',monitoring/command/feature/instance'
. ',icingadb/command/feature/instance'
. ',monitoring/command/feature/object/active-checks'
. ',icingadb/command/feature/object/active-checks'
. ',monitoring/command/feature/object/passive-checks'
. ',icingadb/command/feature/object/passive-checks'
. ',monitoring/command/feature/object/notifications'
. ',icingadb/command/feature/object/notifications'
. ',monitoring/command/feature/object/event-handler'
. ',icingadb/command/feature/object/event-handler'
. ',monitoring/command/feature/object/flap-detection'
. ',icingadb/command/feature/object/flap-detection'
. ',monitoring/command/send-custom-notification'
. ',icingadb/command/send-custom-notification'
],
'full-with-refusals' => [
'permissions' => 'module/monitoring,monitoring/command/*,icingadb/command/*',
'refusals' => 'monitoring/command/downtime/*'
. ',icingadb/command/downtime/*'
. ',monitoring/command/feature/instance'
. ',icingadb/command/feature/instance'
],
'active-only' => [
'permissions' => 'module/monitoring'
. ',monitoring/command/schedule-check/active-only'
. ',icingadb/command/schedule-check/active-only'
],
'no-monitoring-contacts' => [
'permissions' => 'module/monitoring,no-monitoring/contacts',
'icingadb/denylist/routes' => 'contacts,contactgroups'
],
'reporting-only' => [
'permissions' => 'module/reporting'
],
'icingadb' => [
'icingadb/filter/objects' => 'host.name~%2Afoo%2A|hostgroup.name~%2Afoo%2A',
'icingadb/filter/services' => 'service.name~%2Abar%2A&service.vars.env=prod',
'icingadb/filter/hosts' => 'host.vars.env~%2Afoo%2A'
]
]
],
'single-role-or-group' => [
'initial' => [
'one' => [
'groups' => 'support,helpdesk',
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'two' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'three' => [
'icingadb/filter/objects' => 'host.name=%2Afoo%2A'
]
],
'expected' => [
'one' => [
'groups' => 'support,helpdesk',
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo',
'icingadb/filter/objects' => 'host.name=foo|hostgroup.name=foo'
],
'two' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'three' => [
'icingadb/filter/objects' => 'host.name=%2Afoo%2A'
]
]
]
];
protected $defaultConfigDir;
protected $fileStorage;
protected function setUp(): void
{
$this->defaultConfigDir = Config::$configDir;
$this->fileStorage = new TemporaryLocalFileStorage();
Config::$configDir = dirname($this->fileStorage->resolvePath('bogus'));
}
protected function tearDown(): void
{
Config::$configDir = $this->defaultConfigDir;
unset($this->fileStorage); // Should clean up automatically
Config::module('monitoring', 'config', true);
}
protected function getConfig(string $case): array
{
return [$this->config[$case]['initial'], $this->config[$case]['expected']];
}
protected function createConfig(string $path, array $data): void
{
$config = new Config(new ConfigObject($data));
$config->saveIni($this->fileStorage->resolvePath($path));
}
protected function loadConfig(string $path): array
{
return Config::fromIni($this->fileStorage->resolvePath($path))->toArray();
}
protected function createCommandInstance(string ...$params): MigrateCommand
{
array_unshift($params, 'program');
$app = $this->createConfiguredMock(Cli::class, [
'getParams' => new Params($params),
'getModuleManager' => $this->createConfiguredMock(Manager::class, [
'loadEnabledModules' => null
])
]);
return new MigrateCommand(
$app,
'migrate',
'toicingadb',
'dashboard',
false
);
}
/**
* Checks the following:
* - Whether only a single user is handled
* - Whether backups are made
* - Whether a second run changes nothing, if nothing changed
* - Whether a second run keeps the backup, if nothing changed
* - Whether a new backup isn't made, if nothing changed
* - Whether existing Icinga DB dashboards are transformed regarding wildcard filters
*/
public function testDashboardMigrationBehavesAsExpectedByDefault()
{
[$initialConfig, $expected] = $this->getConfig('dashboards');
$this->createConfig('dashboards/test/dashboard.ini', $initialConfig);
$this->createConfig('dashboards/test2/dashboard.ini', $initialConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->dashboardAction();
$config = $this->loadConfig('dashboards/test/dashboard.ini');
$this->assertSame($expected, $config);
$config2 = $this->loadConfig('dashboards/test2/dashboard.ini');
$this->assertSame($initialConfig, $config2);
$backup = $this->loadConfig('dashboards/test/dashboard.backup.ini');
$this->assertSame($initialConfig, $backup);
$command = $this->createCommandInstance('--user', 'test');
$command->dashboardAction();
$configAfterSecondRun = $this->loadConfig('dashboards/test/dashboard.ini');
$this->assertSame($config, $configAfterSecondRun);
$backupAfterSecondRun = $this->loadConfig('dashboards/test/dashboard.backup.ini');
$this->assertSame($backup, $backupAfterSecondRun);
$backup1AfterSecondRun = $this->loadConfig('dashboards/test/dashboard.backup1.ini');
$this->assertEmpty($backup1AfterSecondRun);
}
/**
* Checks the following:
* - Whether a second run creates a new backup, if something changed
*/
public function testDashboardMigrationCreatesMultipleBackups()
{
$initialOldConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
]
];
$initialNewConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
],
'hosts.group_members' => [
'title' => 'Group Members',
'url' => 'monitoring/list/hosts?hostgroup_name=group1|hostgroup_name=group2'
]
];
$expectedNewConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
]
];
$expectedFinalConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
],
'hosts.group_members' => [
'title' => 'Group Members',
'url' => 'icingadb/hosts?hostgroup.name=group1|hostgroup.name=group2'
]
];
$this->createConfig('dashboards/test/dashboard.ini', $initialOldConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->dashboardAction();
$newConfig = $this->loadConfig('dashboards/test/dashboard.ini');
$this->assertSame($expectedNewConfig, $newConfig);
$oldBackup = $this->loadConfig('dashboards/test/dashboard.backup.ini');
$this->assertSame($initialOldConfig, $oldBackup);
$this->createConfig('dashboards/test/dashboard.ini', $initialNewConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->dashboardAction();
$finalConfig = $this->loadConfig('dashboards/test/dashboard.ini');
$this->assertSame($expectedFinalConfig, $finalConfig);
$newBackup = $this->loadConfig('dashboards/test/dashboard.backup1.ini');
$this->assertSame($initialNewConfig, $newBackup);
}
/**
* Checks the following:
* - Whether backups are skipped
*
* @depends testDashboardMigrationBehavesAsExpectedByDefault
*/
public function testDashboardMigrationSkipsBackupIfRequested()
{
[$initialConfig, $expected] = $this->getConfig('dashboards');
$this->createConfig('dashboards/test/dashboard.ini', $initialConfig);
$command = $this->createCommandInstance('--user', 'test', '--no-backup');
$command->dashboardAction();
$config = $this->loadConfig('dashboards/test/dashboard.ini');
$this->assertSame($expected, $config);
$backup = $this->loadConfig('dashboards/test/dashboard.backup.ini');
$this->assertEmpty($backup);
}
/**
* Checks the following:
* - Whether multiple users are handled
* - Whether multiple backups are made
*
* @depends testDashboardMigrationBehavesAsExpectedByDefault
*/
public function testDashboardMigrationMigratesAllUsers()
{
[$initialConfig, $expected] = $this->getConfig('dashboards');
$users = ['foo', 'bar', 'raboof'];
foreach ($users as $user) {
$this->createConfig("dashboards/$user/dashboard.ini", $initialConfig);
}
$command = $this->createCommandInstance('--user', '*');
$command->dashboardAction();
foreach ($users as $user) {
$config = $this->loadConfig("dashboards/$user/dashboard.ini");
$this->assertSame($expected, $config);
$backup = $this->loadConfig("dashboards/$user/dashboard.backup.ini");
$this->assertSame($initialConfig, $backup);
}
}
public function testDashboardMigrationExpectsUserSwitch()
{
$this->expectException(MissingParameterException::class);
$this->expectExceptionMessage('Required parameter \'user\' missing');
$command = $this->createCommandInstance();
$command->dashboardAction();
}
/**
* Checks the following:
* - Whether only a single user is handled
* - Whether shared items are migrated, depending on the owner
* - Whether old configs are kept/or backups are created
* - Whether a second run changes nothing, if nothing changed
* - Whether a second run keeps the backup, if nothing changed
* - Whether a new backup isn't created, if nothing changed
*/
public function testNavigationMigrationBehavesAsExpectedByDefault()
{
[$initialMenuConfig, $expectedMenu] = $this->getConfig('menu-items');
[$initialHostConfig, $expectedHosts] = $this->getConfig('host-actions');
[$initialServiceConfig, $expectedServices] = $this->getConfig('service-actions');
$this->createConfig('preferences/test/menu.ini', $initialMenuConfig);
$this->createConfig('preferences/test/host-actions.ini', $initialHostConfig);
$this->createConfig('preferences/test/service-actions.ini', $initialServiceConfig);
$this->createConfig('preferences/test2/menu.ini', $initialMenuConfig);
$this->createConfig('preferences/test2/host-actions.ini', $initialHostConfig);
$this->createConfig('preferences/test2/service-actions.ini', $initialServiceConfig);
[$initialSharedMenuConfig, $expectedSharedMenu] = $this->getConfig('shared-menu-items');
$this->createConfig('navigation/menu.ini', $initialSharedMenuConfig);
[$initialSharedConfig, $expectedShared] = $this->getConfig('shared-host-actions');
$this->createConfig('navigation/host-actions.ini', $initialSharedConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$menuConfig = $this->loadConfig('preferences/test/menu.ini');
$this->assertSame($expectedMenu, $menuConfig);
$sharedMenuConfig = $this->loadConfig('navigation/menu.ini');
$this->assertSame($expectedSharedMenu, $sharedMenuConfig);
$menuConfig2 = $this->loadConfig('preferences/test2/menu.ini');
$this->assertSame($initialMenuConfig, $menuConfig2);
$menuBackup = $this->loadConfig('preferences/test/menu.backup.ini');
$this->assertSame($initialMenuConfig, $menuBackup);
$hosts = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$services = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$this->assertSame($expectedHosts, $hosts);
$this->assertSame($expectedServices, $services);
$sharedConfig = $this->loadConfig('navigation/icingadb-host-actions.ini');
$this->assertSame($expectedShared, $sharedConfig);
$hosts2 = $this->loadConfig('preferences/test2/icingadb-host-actions.ini');
$services2 = $this->loadConfig('preferences/test2/icingadb-service-actions.ini');
$this->assertEmpty($hosts2);
$this->assertEmpty($services2);
$oldHosts = $this->loadConfig('preferences/test/host-actions.ini');
$oldServices = $this->loadConfig('preferences/test/service-actions.ini');
$this->assertSame($initialHostConfig, $oldHosts);
$this->assertSame($initialServiceConfig, $oldServices);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$menuConfigAfterSecondRun = $this->loadConfig('preferences/test/menu.ini');
$this->assertSame($menuConfig, $menuConfigAfterSecondRun);
$menuBackupAfterSecondRun = $this->loadConfig('preferences/test/menu.backup.ini');
$this->assertSame($menuBackup, $menuBackupAfterSecondRun);
$menuBackup1AfterSecondRun = $this->loadConfig('preferences/test/menu.backup1.ini');
$this->assertEmpty($menuBackup1AfterSecondRun);
$hostsAfterSecondRun = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$servicesAfterSecondRun = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$this->assertSame($hosts, $hostsAfterSecondRun);
$this->assertSame($services, $servicesAfterSecondRun);
}
/**
* Checks the following:
* - Whether a second run creates a new backup, if something changed
*
* @depends testNavigationMigrationBehavesAsExpectedByDefault
*/
public function testNavigationMigrationCreatesMultipleBackups()
{
$initialOldConfig = [
'hosts' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
]
];
$initialNewConfig = [
'hosts' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
],
'group_members' => [
'title' => 'Group Members',
'url' => 'monitoring/list/hosts?hostgroup_name=group1|hostgroup_name=group2'
]
];
$expectedNewConfig = [
'hosts' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
]
];
$expectedFinalConfig = [
'hosts' => [
'title' => 'Host Problems',
'url' => 'icingadb/hosts?host.state.is_problem=y'
],
'group_members' => [
'title' => 'Group Members',
'url' => 'icingadb/hosts?hostgroup.name=group1|hostgroup.name=group2'
]
];
$this->createConfig('preferences/test/menu.ini', $initialOldConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$newConfig = $this->loadConfig('preferences/test/menu.ini');
$this->assertSame($expectedNewConfig, $newConfig);
$oldBackup = $this->loadConfig('preferences/test/menu.backup.ini');
$this->assertSame($initialOldConfig, $oldBackup);
$this->createConfig('preferences/test/menu.ini', $initialNewConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$finalConfig = $this->loadConfig('preferences/test/menu.ini');
$this->assertSame($expectedFinalConfig, $finalConfig);
$newBackup = $this->loadConfig('preferences/test/menu.backup1.ini');
$this->assertSame($initialNewConfig, $newBackup);
}
/**
* Checks the following:
* - Whether backups are skipped
*
* @depends testNavigationMigrationBehavesAsExpectedByDefault
*/
public function testNavigationMigrationSkipsBackupIfRequested()
{
[$initialConfig, $expected] = $this->getConfig('menu-items');
$this->createConfig('preferences/test/menu.ini', $initialConfig);
$command = $this->createCommandInstance('--user', 'test', '--no-backup');
$command->navigationAction();
$config = $this->loadConfig('preferences/test/menu.ini');
$this->assertSame($expected, $config);
$backup = $this->loadConfig('preferences/test/menu.backup.ini');
$this->assertEmpty($backup);
}
/**
* Checks the following:
* - Whether existing Icinga DB Actions are transformed regarding wildcard filters
*/
public function testNavigationMigrationTransformsAlreadyExistingIcingaDBActions()
{
[$initialHostConfig, $expectedHosts] = $this->getConfig('icingadb-host-actions');
[$initialServiceConfig, $expectedServices] = $this->getConfig('icingadb-service-actions');
$this->createConfig('preferences/test/icingadb-host-actions.ini', $initialHostConfig);
$this->createConfig('preferences/test/icingadb-service-actions.ini', $initialServiceConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$hosts = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$services = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$this->assertSame($expectedHosts, $hosts);
$this->assertSame($expectedServices, $services);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$hostsAfterSecondRun = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$servicesAfterSecondRun = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$this->assertSame($hosts, $hostsAfterSecondRun);
$this->assertSame($services, $servicesAfterSecondRun);
}
/**
* Checks the following:
* - Whether legacy host/service macros are migrated
*/
public function testNavigationMigrationMigratesLegacyMacros()
{
[$initialHostConfig, $expectedHosts] = $this->getConfig('host-actions-legacy-macros');
[$initialServiceConfig, $expectedServices] = $this->getConfig('service-actions-legacy-macros');
$this->createConfig('preferences/test/host-actions.ini', $initialHostConfig);
$this->createConfig('preferences/test/service-actions.ini', $initialServiceConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$hosts = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$services = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$this->assertSame($expectedHosts, $hosts);
$this->assertSame($expectedServices, $services);
}
/**
* Checks the following:
* - Whether old configs are removed
*/
public function testNavigationMigrationDeletesOldConfigsIfRequested()
{
[$initialHostConfig, $expectedHosts] = $this->getConfig('host-actions');
[$initialServiceConfig, $expectedServices] = $this->getConfig('service-actions');
$this->createConfig('preferences/test/host-actions.ini', $initialHostConfig);
$this->createConfig('preferences/test/service-actions.ini', $initialServiceConfig);
$command = $this->createCommandInstance('--user', 'test', '--no-backup');
$command->navigationAction();
$hosts = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$services = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$this->assertSame($expectedHosts, $hosts);
$this->assertSame($expectedServices, $services);
$oldHosts = $this->loadConfig('preferences/test/host-actions.ini');
$oldServices = $this->loadConfig('preferences/test/service-actions.ini');
$this->assertEmpty($oldHosts);
$this->assertEmpty($oldServices);
}
/**
* Checks the following:
* - Whether existing configs are left alone by default
* - Whether existing configs are overridden if requested
*/
public function testNavigationMigrationOverridesExistingActionsIfRequested()
{
$initialOldUserConfig = [
'hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A'
]
];
$initialOldSharedConfig = [
'hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A',
'owner' => 'test'
]
];
$initialNewUserConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Abar%2A'
]
];
$initialNewSharedConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Abar%2A',
'owner' => 'test'
]
];
$expectedFinalUserConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A'
]
];
$expectedFinalSharedConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A',
'owner' => 'test'
]
];
$this->createConfig('preferences/test/host-actions.ini', $initialOldUserConfig);
$this->createConfig('preferences/test/icingadb-host-actions.ini', $initialNewUserConfig);
$this->createConfig('navigation/host-actions.ini', $initialOldSharedConfig);
$this->createConfig('navigation/icingadb-host-actions.ini', $initialNewSharedConfig);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
$finalUserConfig = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$this->assertSame($initialNewUserConfig, $finalUserConfig);
$finalSharedConfig = $this->loadConfig('navigation/icingadb-host-actions.ini');
$this->assertSame($initialNewSharedConfig, $finalSharedConfig);
$command = $this->createCommandInstance('--user', 'test', '--override');
$command->navigationAction();
$finalUserConfig = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$this->assertSame($expectedFinalUserConfig, $finalUserConfig);
$finalSharedConfig = $this->loadConfig('navigation/icingadb-host-actions.ini');
$this->assertSame($expectedFinalSharedConfig, $finalSharedConfig);
}
public function testNavigationMigrationExpectsUserSwitch()
{
$this->expectException(MissingParameterException::class);
$this->expectExceptionMessage('Required parameter \'user\' missing');
$command = $this->createCommandInstance();
$command->navigationAction();
}
/**
* Checks the following:
* - Whether only a single role is handled
* - Whether role name matching works
*/
public function testRoleMigrationHandlesASingleRoleOnlyIfRequested()
{
[$initialConfig, $expected] = $this->getConfig('single-role-or-group');
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--role', 'one');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expected, $config);
}
/**
* Checks the following:
* - Whether only a single role is handled
* - Whether group matching works
*/
public function testRoleMigrationHandlesARoleWithMatchingGroups()
{
[$initialConfig, $expected] = $this->getConfig('single-role-or-group');
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--group', 'support');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expected, $config);
}
/**
* Checks the following:
* - Whether permissions are properly migrated
* - Whether refusals are properly migrated
* - Whether restrictions are properly migrated
* - Whether blacklists are properly migrated
* - Whether backups are created
* - Whether a second run changes nothing, if nothing changed
* - Whether a second run keeps the backup, if nothing changed
* - Whether a new backup isn't created, if nothing changed
*/
public function testRoleMigrationMigratesAllRoles()
{
[$initialConfig, $expected] = $this->getConfig('all-roles');
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--role', '*');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expected, $config);
$backup = $this->loadConfig('roles.backup.ini');
$this->assertSame($initialConfig, $backup);
$command = $this->createCommandInstance('--role', '*');
$command->roleAction();
$configAfterSecondRun = $this->loadConfig('roles.ini');
$this->assertSame($config, $configAfterSecondRun);
$backupAfterSecondRun = $this->loadConfig('roles.backup.ini');
$this->assertSame($backup, $backupAfterSecondRun);
$backup2 = $this->loadConfig('roles.backup1.ini');
$this->assertEmpty($backup2);
}
/**
* Checks the following:
* - Whether backups are skipped
*
* @depends testRoleMigrationMigratesAllRoles
*/
public function testRoleMigrationSkipsBackupIfRequested()
{
[$initialConfig, $expected] = $this->getConfig('all-roles');
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--role', '*', '--no-backup');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expected, $config);
$backup = $this->loadConfig('roles.backup.ini');
$this->assertEmpty($backup);
}
/**
* Checks the following:
* - Whether monitoring's variable protection rules are migrated to all roles granting access to monitoring
*/
public function testRoleMigrationAlsoMigratesVariableProtections()
{
$initialConfig = [
'one' => [
'permissions' => 'module/monitoring'
],
'two' => [
'permissions' => 'module/monitoring'
],
'three' => [
'permissions' => 'module/reporting'
]
];
$expectedConfig = [
'one' => [
'permissions' => 'module/monitoring',
'icingadb/protect/variables' => 'ob.*,env'
],
'two' => [
'permissions' => 'module/monitoring',
'icingadb/protect/variables' => 'ob.*,env'
],
'three' => [
'permissions' => 'module/reporting'
]
];
$this->createConfig('modules/monitoring/config.ini', [
'security' => [
'protected_customvars' => 'ob.*,env'
]
]);
// Invalidate config cache
Config::module('monitoring', 'config', true);
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--role', '*');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expectedConfig, $config);
}
/**
* Checks the following:
* - Whether already migrated roles are skipped during migration
* - Whether already migrated roles are transformed regarding wildcard filters
*/
public function testRoleMigrationSkipsRolesThatAlreadyGrantAccessToIcingaDbButTransformWildcardRestrictions()
{
$initialConfig = [
'only-monitoring' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*',
'monitoring/filter/objects' => 'host_name=%2Afoo%2A'
],
'monitoring-and-icingadb' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*,module/icingadb',
'monitoring/filter/objects' => 'host_name=%2Abar%2A',
'icingadb/filter/objects' => 'host.name=%2Afoo%2A'
]
];
$expectedConfig = [
'only-monitoring' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*,icingadb/command/comment/*',
'monitoring/filter/objects' => 'host_name=%2Afoo%2A',
'icingadb/filter/objects' => 'host.name~%2Afoo%2A'
],
'monitoring-and-icingadb' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*,module/icingadb',
'monitoring/filter/objects' => 'host_name=%2Abar%2A',
'icingadb/filter/objects' => 'host.name~%2Afoo%2A'
]
];
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--role', '*');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expectedConfig, $config);
}
/**
* Checks the following:
* - Whether already migrated roles are reset if requested
*/
public function testRoleMigrationOverridesAlreadyMigratedRolesIfRequested()
{
$initialConfig = [
'only-monitoring' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*',
'monitoring/filter/objects' => 'host_name=%2Afoo%2A'
],
'monitoring-and-icingadb' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*,module/icingadb',
'monitoring/filter/objects' => 'host_name=%2Abar%2A',
'icingadb/filter/objects' => 'host.name=%2Afoo%2A'
]
];
$expectedConfig = [
'only-monitoring' => [
'permissions' => 'module/monitoring,monitoring/command/comment/*,icingadb/command/comment/*',
'monitoring/filter/objects' => 'host_name=%2Afoo%2A',
'icingadb/filter/objects' => 'host.name~%2Afoo%2A'
],
'monitoring-and-icingadb' => [
'permissions' => 'module/monitoring'
. ',monitoring/command/comment/*'
. ',icingadb/command/comment/*',
'monitoring/filter/objects' => 'host_name=%2Abar%2A',
'icingadb/filter/objects' => 'host.name~%2Abar%2A'
]
];
$this->createConfig('roles.ini', $initialConfig);
$command = $this->createCommandInstance('--role', '*', '--override');
$command->roleAction();
$config = $this->loadConfig('roles.ini');
$this->assertSame($expectedConfig, $config);
}
public function testRoleMigrationExpectsTheRoleOrGroupSwitch()
{
$this->expectException(IcingaException::class);
$this->expectExceptionMessage("One of the parameters 'group' or 'role' must be supplied");
$command = $this->createCommandInstance();
$command->roleAction();
}
public function testRoleMigrationExpectsEitherTheRoleOrGroupSwitchButNotBoth()
{
$this->expectException(IcingaException::class);
$this->expectExceptionMessage("Use either 'group' or 'role'. Both cannot be used as role overrules group.");
$command = $this->createCommandInstance('--role=foo', '--group=bar');
$command->roleAction();
}
public function testFilterMigrationWorksAsExpected()
{
$initialHostActionConfig = [
'hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A'
]
];
$expectedHostActionConfig = $initialHostActionConfig;
$initialIcingadbHostActionConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name=%2Afoo%2A'
]
];
$expectedIcingadbHostActionConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A'
]
];
$initialServiceActionConfig = [
'services' => [
'type' => 'service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => '_service_foo=bar&_service_bar=%2Afoo%2A'
]
];
$expectedServiceActionConfig = $initialServiceActionConfig;
$initialIcingadbServiceActionConfig = [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=bar&service.vars.bar=%2Afoo%2A'
]
];
$expectedIcingadbServiceActionConfig = [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=bar&service.vars.bar~%2Afoo%2A'
]
];
$initialMenuConfig = [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name=%2Afoo%2A'
]
];
$expectedMenuConfig = [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A'
]
];
$initialDashboardConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb' => [
'title' => 'Icinga DB'
],
'icingadb.wildcards' => [
'title' => 'Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name=%2Alinux%2A'
]
];
$expectedDashboardConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb' => [
'title' => 'Icinga DB'
],
'icingadb.wildcards' => [
'title' => 'Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name~%2Alinux%2A'
]
];
$initialRoleConfig = [
'one' => [
'groups' => 'support,helpdesk',
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'two' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'three' => [
'icingadb/filter/objects' => 'host.name=%2Afoo%2A'
]
];
$expectedRoleConfig = [
'one' => [
'groups' => 'support,helpdesk',
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'two' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'three' => [
'icingadb/filter/objects' => 'host.name~%2Afoo%2A'
]
];
$this->createConfig('preferences/test/host-actions.ini', $initialHostActionConfig);
$this->createConfig('preferences/test/service-actions.ini', $initialServiceActionConfig);
$this->createConfig('preferences/test/icingadb-host-actions.ini', $initialIcingadbHostActionConfig);
$this->createConfig('preferences/test/icingadb-service-actions.ini', $initialIcingadbServiceActionConfig);
$this->createConfig('dashboards/test/dashboard.ini', $initialDashboardConfig);
$this->createConfig('preferences/test/menu.ini', $initialMenuConfig);
$this->createConfig('roles.ini', $initialRoleConfig);
$command = $this->createCommandInstance();
$command->filterAction();
$hostActionConfig = $this->loadConfig('preferences/test/host-actions.ini');
$serviceActionConfig = $this->loadConfig('preferences/test/service-actions.ini');
$icingadbHostActionConfig = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$icingadbServiceActionConfig = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$dashboardBackup = $this->loadConfig('dashboards/test/dashboard.backup.ini');
$dashboardConfig = $this->loadConfig('dashboards/test/dashboard.ini');
$menuBackup = $this->loadConfig('preferences/test/menu.backup.ini');
$menuConfig = $this->loadConfig('preferences/test/menu.ini');
$roleBackup = $this->loadConfig('roles.backup.ini');
$roleConfig = $this->loadConfig('roles.ini');
$this->assertSame($expectedHostActionConfig, $hostActionConfig);
$this->assertSame($expectedServiceActionConfig, $serviceActionConfig);
$this->assertSame($initialDashboardConfig, $dashboardBackup);
$this->assertSame($initialMenuConfig, $menuBackup);
$this->assertSame($initialRoleConfig, $roleBackup);
$this->assertSame($expectedIcingadbHostActionConfig, $icingadbHostActionConfig);
$this->assertSame($expectedIcingadbServiceActionConfig, $icingadbServiceActionConfig);
$this->assertSame($expectedDashboardConfig, $dashboardConfig);
$this->assertSame($expectedMenuConfig, $menuConfig);
$this->assertSame($expectedRoleConfig, $roleConfig);
}
/**
* @depends testFilterMigrationWorksAsExpected
*/
public function testFilterMigrationSkipsBackupsIfRequested()
{
$initialHostActionConfig = [
'hosts' => [
'type' => 'host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host_name=%2Afoo%2A'
]
];
$expectedHostActionConfig = $initialHostActionConfig;
$initialIcingadbHostActionConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name=%2Afoo%2A'
]
];
$expectedIcingadbHostActionConfig = [
'hosts' => [
'type' => 'icingadb-host-action',
'url' => 'example.com/search?q=$host.name$',
'filter' => 'host.name~%2Afoo%2A'
]
];
$initialServiceActionConfig = [
'services' => [
'type' => 'service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => '_service_foo=bar&_service_bar=%2Afoo%2A'
]
];
$expectedServiceActionConfig = $initialServiceActionConfig;
$initialIcingadbServiceActionConfig = [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=bar&service.vars.bar=%2Afoo%2A'
]
];
$expectedIcingadbServiceActionConfig = [
'services' => [
'type' => 'icingadb-service-action',
'url' => 'example.com/search?q=$service.name$,$host.name$,$host.address$,$host.address6$',
'filter' => 'service.vars.foo=bar&service.vars.bar~%2Afoo%2A'
]
];
$initialMenuConfig = [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name=%2Afoo%2A'
]
];
$expectedMenuConfig = [
'foreign-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'example.com?q=foo'
],
'monitoring-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb-url' => [
'type' => 'menu-item',
'target' => '_blank',
'url' => 'icingadb/hosts?host.name~%2Afoo%2A'
]
];
$initialDashboardConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb' => [
'title' => 'Icinga DB'
],
'icingadb.wildcards' => [
'title' => 'Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name=%2Alinux%2A'
]
];
$expectedDashboardConfig = [
'hosts' => [
'title' => 'Hosts'
],
'hosts.problems' => [
'title' => 'Host Problems',
'url' => 'monitoring/list/hosts?host_problem=1'
],
'icingadb' => [
'title' => 'Icinga DB'
],
'icingadb.wildcards' => [
'title' => 'Wildcards',
'url' => 'icingadb/hosts?host.state.is_problem=y&hostgroup.name~%2Alinux%2A'
]
];
$initialRoleConfig = [
'one' => [
'groups' => 'support,helpdesk',
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'two' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'three' => [
'icingadb/filter/objects' => 'host.name=%2Afoo%2A'
]
];
$expectedRoleConfig = [
'one' => [
'groups' => 'support,helpdesk',
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'two' => [
'monitoring/filter/objects' => 'host_name=foo|hostgroup_name=foo'
],
'three' => [
'icingadb/filter/objects' => 'host.name~%2Afoo%2A'
]
];
$this->createConfig('preferences/test/host-actions.ini', $initialHostActionConfig);
$this->createConfig('preferences/test/service-actions.ini', $initialServiceActionConfig);
$this->createConfig('preferences/test/icingadb-host-actions.ini', $initialIcingadbHostActionConfig);
$this->createConfig('preferences/test/icingadb-service-actions.ini', $initialIcingadbServiceActionConfig);
$this->createConfig('dashboards/test/dashboard.ini', $initialDashboardConfig);
$this->createConfig('preferences/test/menu.ini', $initialMenuConfig);
$this->createConfig('roles.ini', $initialRoleConfig);
$command = $this->createCommandInstance('--no-backup');
$command->filterAction();
$hostActionConfig = $this->loadConfig('preferences/test/host-actions.ini');
$serviceActionConfig = $this->loadConfig('preferences/test/service-actions.ini');
$icingadbHostActionConfig = $this->loadConfig('preferences/test/icingadb-host-actions.ini');
$icingadbServiceActionConfig = $this->loadConfig('preferences/test/icingadb-service-actions.ini');
$dashboardBackup = $this->loadConfig('dashboards/test/dashboard.backup.ini');
$dashboardConfig = $this->loadConfig('dashboards/test/dashboard.ini');
$menuBackup = $this->loadConfig('preferences/test/menu.backup.ini');
$menuConfig = $this->loadConfig('preferences/test/menu.ini');
$roleBackup = $this->loadConfig('roles.backup.ini');
$roleConfig = $this->loadConfig('roles.ini');
$this->assertSame($expectedHostActionConfig, $hostActionConfig);
$this->assertSame($expectedServiceActionConfig, $serviceActionConfig);
$this->assertEmpty($dashboardBackup);
$this->assertEmpty($menuBackup);
$this->assertEmpty($roleBackup);
$this->assertSame($expectedIcingadbHostActionConfig, $icingadbHostActionConfig);
$this->assertSame($expectedIcingadbServiceActionConfig, $icingadbServiceActionConfig);
$this->assertSame($expectedDashboardConfig, $dashboardConfig);
$this->assertSame($expectedMenuConfig, $menuConfig);
$this->assertSame($expectedRoleConfig, $roleConfig);
}
public function testNavigationMigrationWorksEvenIfOnlySharedItemsExist()
{
$this->expectNotToPerformAssertions();
$this->createConfig('navigation/menu.ini', []);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
}
public function testNavigationMigrationWorksEvenIfOnlyUserItemsExist()
{
$this->expectNotToPerformAssertions();
$this->createConfig('preferences/test/menu.ini', []);
$command = $this->createCommandInstance('--user', 'test');
$command->navigationAction();
}
public function testDashboardMigrationWorksEvenIfNoDashboardsExist()
{
$this->expectNotToPerformAssertions();
$command = $this->createCommandInstance('--user', 'test');
$command->dashboardAction();
}
}