ServiceapplyrulesController and related changes

fixes #1755
This commit is contained in:
Thomas Gelf 2019-02-15 01:29:43 +01:00
parent 85ed54f932
commit 8046510b1f
6 changed files with 70 additions and 6 deletions

View File

@ -0,0 +1,39 @@
<?php
namespace Icinga\Module\Director\Controllers;
use Icinga\Exception\NotFoundError;
use Icinga\Module\Director\Objects\IcingaService;
use Icinga\Module\Director\RestApi\IcingaObjectsHandler;
use Icinga\Module\Director\Web\Controller\ActionController;
use Icinga\Module\Director\Web\Table\ApplyRulesTable;
class ServiceapplyrulesController extends ActionController
{
protected $isApified = true;
public function indexAction()
{
$request = $this->getRequest();
if (! $request->isApiRequest()) {
throw new NotFoundError('Not found');
}
$table = ApplyRulesTable::create('service', $this->db());
/*
$query = $this->db()->getDbAdapter()
->select()
->from('icinga_service')
->where('object_type = ?', 'apply');
$rules = IcingaService::loadAll($this->db(), $query);
*/
$handler = (new IcingaObjectsHandler(
$request,
$this->getResponse(),
$this->db()
))->setTable($table);
$handler->dispatch();
}
}

View File

@ -487,6 +487,15 @@ Content-Type: application/json
} }
``` ```
### Service Apply Rules
Please note that Service Apply Rule names are not unique in Icinga 2. They are
not real objects, they are creating other objects in a loop. This makes it
impossible to distinct them by name. Therefore, a dedicated REST API endpoint
`director/serviceapplyrules` ships all Service Apply Rules combined with their
internal ID. This ID can then be used to modify or delete a Rule via
`director/service`.
### Agent Tickets ### Agent Tickets
The Director is very helpful when it goes to manage your Icinga Agents. In The Director is very helpful when it goes to manage your Icinga Agents. In

View File

@ -25,6 +25,7 @@ before switching to a new version.
* FIX: Services from a Set assigned to a single Host can be blacklisted (#1616) * FIX: Services from a Set assigned to a single Host can be blacklisted (#1616)
* FEATURE: Add TimePeriod support to Configuration Baskets (#1735) * FEATURE: Add TimePeriod support to Configuration Baskets (#1735)
* FEATURE: RO users could want to see where a configured service originated (#1785) * FEATURE: RO users could want to see where a configured service originated (#1785)
* FEATURE: introduce director/serviceapplyrules REST API endpoint (#1755)
### REST API ### REST API
* FIX: Self Service API now ships optional Service User parameter (#1297) * FIX: Self Service API now ships optional Service User parameter (#1297)

View File

@ -2773,6 +2773,7 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer
* @param bool $skipDefaults * @param bool $skipDefaults
* @param array|null $chosenProperties * @param array|null $chosenProperties
* @param bool $resolveIds * @param bool $resolveIds
* @param bool $keepId
* @return object * @return object
* @throws NotFoundError * @throws NotFoundError
*/ */
@ -2780,7 +2781,8 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer
$resolved = false, $resolved = false,
$skipDefaults = false, $skipDefaults = false,
array $chosenProperties = null, array $chosenProperties = null,
$resolveIds = true $resolveIds = true,
$keepId = false
) { ) {
$props = array(); $props = array();
@ -2799,7 +2801,7 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer
foreach ($p as $k => $v) { foreach ($p as $k => $v) {
// Do not ship ids for IcingaObjects: // Do not ship ids for IcingaObjects:
if ($resolveIds) { if ($resolveIds) {
if ($k === 'id' && $this->hasProperty('object_name')) { if ($k === 'id' && $keepId === false && $this->hasProperty('object_name')) {
continue; continue;
} }

View File

@ -7,6 +7,7 @@ use Icinga\Application\Benchmark;
use Icinga\Exception\ProgrammingError; use Icinga\Exception\ProgrammingError;
use Icinga\Module\Director\Db\Cache\PrefetchCache; use Icinga\Module\Director\Db\Cache\PrefetchCache;
use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Module\Director\Objects\IcingaObject;
use Icinga\Module\Director\Web\Table\ApplyRulesTable;
use Icinga\Module\Director\Web\Table\ObjectsTable; use Icinga\Module\Director\Web\Table\ObjectsTable;
use Zend_Db_Select as ZfSelect; use Zend_Db_Select as ZfSelect;
@ -25,7 +26,11 @@ class IcingaObjectsHandler extends RequestHandler
} }
} }
public function setTable(ObjectsTable $table) /**
* @param ObjectsTable|ApplyRulesTable $table
* @return $this
*/
public function setTable($table)
{ {
$this->table = $table; $this->table = $table;
return $this; return $this;
@ -63,12 +68,13 @@ class IcingaObjectsHandler extends RequestHandler
->columns('*') ->columns('*')
->reset(ZfSelect::LIMIT_COUNT) ->reset(ZfSelect::LIMIT_COUNT)
->reset(ZfSelect::LIMIT_OFFSET); ->reset(ZfSelect::LIMIT_OFFSET);
$type = $table->getType();
$serviceApply = $type === 'service' && $table instanceof ApplyRulesTable;
echo '{ "objects": [ '; echo '{ "objects": [ ';
$cnt = 0; $cnt = 0;
$objects = []; $objects = [];
$dummy = IcingaObject::createByType($table->getType(), [], $connection); $dummy = IcingaObject::createByType($type, [], $connection);
$dummy->prefetchAllRelatedTypes(); $dummy->prefetchAllRelatedTypes();
Benchmark::measure('Pre-fetching related objects'); Benchmark::measure('Pre-fetching related objects');
@ -100,7 +106,9 @@ class IcingaObjectsHandler extends RequestHandler
$objects[] = json_encode($object->toPlainObject( $objects[] = json_encode($object->toPlainObject(
$resolved, $resolved,
$withNull, $withNull,
$properties $properties,
true,
$serviceApply
), JSON_PRETTY_PRINT); ), JSON_PRETTY_PRINT);
if ($first) { if ($first) {
Benchmark::measure('Got first row'); Benchmark::measure('Got first row');

View File

@ -38,6 +38,11 @@ class ApplyRulesTable extends ZfQueryBasedTable
return $this; return $this;
} }
public function getType()
{
return $this->type;
}
public function getColumnsToBeRendered() public function getColumnsToBeRendered()
{ {
return ['Name', 'assign where'/*, 'Actions'*/]; return ['Name', 'assign where'/*, 'Actions'*/];