BasketSnapshot: add Datafields to the mix

This commit is contained in:
Thomas Gelf 2018-10-08 18:17:41 +02:00
parent a58efd2d25
commit 2e37758336
2 changed files with 71 additions and 0 deletions

View File

@ -5,6 +5,7 @@ namespace Icinga\Module\Director\DirectorObject\Automation;
use Icinga\Module\Director\Core\Json;
use Icinga\Module\Director\Db;
use Icinga\Module\Director\Data\Db\DbObject;
use Icinga\Module\Director\Objects\DirectorDatafield;
use Icinga\Module\Director\Objects\IcingaCommand;
use Icinga\Module\Director\Objects\IcingaObject;
use RuntimeException;
@ -23,6 +24,7 @@ class BasketSnapshot extends DbObject
];
protected $restoreOrder = [
'Datafield',
'Command',
'HostGroup',
'IcingaTemplateChoiceHost',
@ -48,6 +50,7 @@ class BasketSnapshot extends DbObject
public static function getClassForType($type)
{
$types = [
'Datafield' => '\\Icinga\\Module\\Director\\Objects\\DirectorDatafield',
'Command' => '\\Icinga\\Module\\Director\\Objects\\IcingaCommand',
'HostGroup' => '\\Icinga\\Module\\Director\\Objects\\IcingaHostGroup',
'IcingaTemplateChoiceHost' => '\\Icinga\\Module\\Director\\Objects\\IcingaTemplateChoiceHost',
@ -73,10 +76,39 @@ class BasketSnapshot extends DbObject
'basket_uuid' => $basket->get('uuid')
], $db);
$snapshot->addObjectsChosenByBasket($basket);
$snapshot->resolveRequiredFields();
return $snapshot;
}
/**
* @throws \Icinga\Exception\NotFoundError
*/
protected function resolveRequiredFields()
{
$requiredIds = [];
foreach ($this->objects as $typeName => $objects) {
foreach ($objects as $key => $object) {
if (isset($object->fields)) {
foreach ($object->fields as $field) {
$requiredIds[$field->datafield_id] = true;
}
}
}
}
$connection = $this->getConnection();
if (! isset($this->objects['Datafield'])) {
$this->objects['Datafield'] = [];
}
$fields = & $this->objects['Datafield'];
foreach ($requiredIds as $id) {
if (! isset($fields[$id])) {
$fields[$id] = DirectorDatafield::loadWithAutoIncId((int) $id, $connection)->export();
}
}
}
protected function addObjectsChosenByBasket(Basket $basket)
{
foreach ($basket->getChosenObjects() as $typeName => $selection) {

View File

@ -2,10 +2,13 @@
namespace Icinga\Module\Director\Objects;
use Icinga\Module\Director\Core\Json;
use Icinga\Module\Director\Data\Db\DbObjectWithSettings;
use Icinga\Module\Director\Db;
use Icinga\Module\Director\Exception\DuplicateKeyException;
use Icinga\Module\Director\Hook\DataTypeHook;
use Icinga\Module\Director\Web\Form\DirectorObjectForm;
use InvalidArgumentException;
use Zend_Form_Element as ZfElement;
class DirectorDatafield extends DbObjectWithSettings
@ -50,6 +53,10 @@ class DirectorDatafield extends DbObjectWithSettings
return $obj;
}
/**
* @return object
* @throws \Icinga\Exception\NotFoundError
*/
public function export()
{
$plain = (object) $this->getProperties();
@ -68,6 +75,38 @@ class DirectorDatafield extends DbObjectWithSettings
return $plain;
}
/**
* @param $plain
* @param Db $db
* @param bool $replace
* @return DirectorDatafield
* @throws DuplicateKeyException
* @throws \Icinga\Exception\NotFoundError
*/
public static function import($plain, Db $db, $replace = false)
{
$properties = (array) $plain;
if (isset($properties['originalId'])) {
$id = $properties['originalId'];
unset($properties['originalId']);
} else {
$id = null;
}
if ($id) {
if (static::exists($id, $db)) {
$existing = static::loadWithAutoIncId($id, $db);
$existingProperties = (array) $existing->export();
unset($existingProperties['originalId']);
if (Json::encode($properties) === Json::encode($existingProperties)) {
return $existing;
}
}
}
return static::create($properties, $db);
}
protected function setObject(IcingaObject $object)
{
$this->object = $object;