icingaweb2/modules/monitoring/test/php/testlib/datasource/strategies/StatusdatInsertionStrategy.php

296 lines
10 KiB
PHP

<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Test\Monitoring\Testlib\Datasource\Strategies;
use Test\Monitoring\Testlib\DataSource\schemes\ObjectsCacheTemplates;
use \Test\Monitoring\Testlib\DataSource\TestFixture;
use \Test\Monitoring\Testlib\DataSource\schemes\StatusdatTemplates;
require_once(dirname(__FILE__).'/../schemes/ObjectsCacheTemplates.php');
require_once(dirname(__FILE__).'/../schemes/StatusdatTemplates.php');
/**
* An @see InsertionStrategy for creating status.dat and objects.cache
* files from a TestFixture
*
* This class helps testing status.dat backends by writing testfixtures
* to according objects.cache and status.dat files which then can be read
* by the Statusdat parser and used in tests.
*
* The Templates for insertion can be found under schemes/objectsCacheTemplates.php
* and schemes/StatusdatTempaltes.php
*
*/
class StatusdatInsertionStrategy implements InsertionStrategy {
/**
* The status.dat filename to write the object-state to
* @var String
*/
private $statusDatFile;
/**
* The objects.cache filename to write the object structure to
* @var String
*/
private $objectsCacheFile;
/**
* The TestFixture that will be written to a status.dat compatible format
* @var TestFixture
*/
private $fixture;
/**
* The content of the status.dat file that will be written
* @var String
*/
private $statusDat;
/**
* The content of the objects.cache file that will be written
* @var String
*/
private $objectsCache;
/**
* Tell this object to use the status.dat/objects.cache file combination
* provided in $resource
*
* @param Array $ressource An associative array containing the following keys:
* - "status_file" : The location where to write the status.dat to
* - "objects_file" : The location to write the objects cache to
*/
public function setConnection($ressource)
{
$this->statusDatFile = $ressource['status_file'];
$this->objectsCacheFile = $ressource['objects_file'];
}
/**
* Insert the provided fixture into the status.dat and objects.cache files for testing
*
* @param TestFixture $fixture The fixture to create status.dat and objects.cache files from
*/
public function insert(TestFixture $fixture)
{
$this->fixture = $fixture;
$this->statusDat = '# Automatically created test statusdat from fixture\n';
$this->objectsCache = '';
$this->insertHoststatus();
$this->insertHosts();
$this->insertServicestatus();
$this->insertServices();
$this->insertHostgroups();
$this->insertServicegroups();
$this->insertComments();
file_put_contents($this->statusDatFile, $this->statusDat);
file_put_contents($this->objectsCacheFile, $this->objectsCache);
}
/**
* Insert the host monitoring state from the provided fixture to the internal
* statusdat string $statusDat
*
*/
private function insertHoststatus()
{
$hosts = $this->fixture->getHosts();
foreach ($hosts as $host) {
$cvs = '';
foreach ($host['customvariables'] as $name=>$var) {
$cvs .= '_'.$name.'='.$var."\n";
}
$flags = $host['flags'];
$hostStatus = str_replace(
array(
'{{HOST_NAME}}', '{{TIME}}', '{{NOTIFICATIONS_ENABLED}}',
'{{ACKNOWLEDGED}}', '{{ACTIVE_ENABLED}}', '{{PASSIVE_ENABLED}}',
'{{FLAPPING}}', '{{IN_DOWNTIME}}', '{{HOST_STATUS}}','{{CVS}}')
, array(
$host['name'], $flags->time, $flags->notifications, $flags->acknowledged,
$flags->active_checks, $flags->passive_checks, $flags->flapping,
$flags->in_downtime, $host['state'], $cvs
), StatusdatTemplates::$HOST);
$this->statusDat .= "\n".$hostStatus;
}
}
/**
* Insert the host object state into the internal objects.cache representation
* $objectsCache
*
*/
private function insertHosts()
{
$hosts = $this->fixture->getHosts();
foreach ($hosts as $host) {
if ($host['flags']->is_pending) {
continue; // Pending states are not written to status.dat yet
}
$hostDefinition = str_replace(
array('\t',
'{{HOST_NAME}}', '{{HOST_ADDRESS}}', '{{ICON_IMAGE}}',
'{{NOTES_URL}}', '{{ACTION_URL}}'
),
array("\t",
$host['name'], $host['address'], $host['icon_image'],
$host['notes_url'], $host['action_url']
),
ObjectsCacheTemplates::$HOST
);
$this->objectsCache .= "\n".$hostDefinition;
}
}
/**
* Insert the service monitoring state from the provided fixture to the internal
* statusdat string $statusDat
*
*/
private function insertServicestatus()
{
$services = $this->fixture->getServices();
foreach ($services as $service) {
if ($service['flags']->is_pending) {
continue; // Pending states are not written to status.dat yet
}
$cvs = '';
foreach ($service['customvariables'] as $name=>$var) {
$cvs .= '_'.$name.'='.$var;
}
$flags = $service['flags'];
$serviceStatus = str_replace(
array(
'{{HOST_NAME}}','{{SERVICE_NAME}}', '{{TIME}}', '{{NOTIFICATIONS_ENABLED}}',
'{{ACKNOWLEDGED}}', '{{ACTIVE_ENABLED}}', '{{PASSIVE_ENABLED}}',
'{{FLAPPING}}', '{{IN_DOWNTIME}}', '{{SERVICE_STATUS}}','{{CVS}}')
, array(
$service['host']['name'], $service['name'], $flags->time, $flags->notifications,
$flags->acknowledged, $flags->active_checks, $flags->passive_checks,
$flags->flapping, $flags->in_downtime, $service['state'], $cvs
), StatusdatTemplates::$SERIVCE);
$this->statusDat .= "\n".$serviceStatus;
}
}
/**
* Insert the service object state into the internal objects.cache representation
* $objectsCache
*
*/
private function insertServices()
{
$services = $this->fixture->getServices();
foreach ($services as $service) {
$serviceDefinition = str_replace(
array('\t',
'{{HOST_NAME}}', '{{SERVICE_NAME}}', '{{ICON_IMAGE}}',
'{{NOTES_URL}}', '{{ACTION_URL}}'
),
array("\t",
$service['host']['name'], $service['name'], $service['icon_image'],
$service['notes_url'], $service['action_url']
),
ObjectsCacheTemplates::$SERVICE
);
$this->objectsCache .= "\n".$serviceDefinition;
}
}
/**
* Inserts a group object into the object.cache file
*
* @param String $type The type of the group ('host' or 'service')
* @param String $name The name of the group to insert
* @param array $members A String array of the members names to use
*/
private function insertGroup($type, $name, array $members)
{
$groupDefinition = str_replace(
array('\t',
'{{TYPE}}', '{{NAME}}', '{{MEMBERS}}'
),
array("\t",
$type, $name, implode(",", $members)
),
ObjectsCacheTemplates::$GROUP
);
$this->objectsCache .= "\n".$groupDefinition;
}
/**
* Insert all hostgroups from the fixtures into the objects.cache
*
*/
private function insertHostgroups()
{
$hostgroups = $this->fixture->getHostgroups();
foreach ($hostgroups as $hostgroup) {
$memberNames = array();
foreach ($hostgroup["members"] as $member) {
$memberNames[] = $member["name"];
}
$this->insertGroup("host", $hostgroup["name"], $memberNames);
}
}
/**
* Inserts all servicegroups from the fixtures into the objects.cache
*
*/
private function insertServicegroups()
{
$servicegroups = $this->fixture->getServicegroups();
foreach ($servicegroups as $servicegroup) {
$memberNames = array();
foreach ($servicegroup["members"] as $member) {
$memberNames[] = $member["host"]["name"];
$memberNames[] = $member["name"];
}
$this->insertGroup("service", $servicegroup["name"], $memberNames);
}
}
/**
* Inserts all comments from the fixtures into the status.dat string
* $statusDat
*
*/
private function insertComments()
{
$comments = $this->fixture->getComments();
$commentId = 1;
foreach($comments as $comment) {
if (isset($comment["service"])) {
$service = $comment["service"];
$commentDefinition = str_replace(
array('{{HOST_NAME}}', '{{SERVICE_NAME}}', '{{TIME}}', '{{AUTHOR}}', '{{TEXT}}', '{{ID}}'),
array(
$service["host"]["name"], $service["name"], $service["flags"]->time,
$comment["author"], $comment["text"], $commentId++
),
StatusdatTemplates::$SERVICECOMMENT
);
} elseif (isset($comment["host"])) {
$host = $comment["host"];
$commentDefinition = str_replace(
array('{{HOST_NAME}}', '{{TIME}}', '{{AUTHOR}}', '{{TEXT}}', '{{ID}}'),
array(
$host["name"], $host["flags"]->time,
$comment["author"], $comment["text"], $commentId++
),
StatusdatTemplates::$HOSTCOMMENT
);
}
$this->statusDat .= "\n".$commentDefinition;
}
}
}