From 67763dc5a9fe413299060782ccfbb46ea3a5b0d0 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Mon, 11 Jun 2018 17:16:01 +0200 Subject: [PATCH] ImportExport: add fail-safe import, WIP --- library/Director/Db.php | 21 +++++++++++++++++++ .../Automation/ImportExport.php | 18 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/library/Director/Db.php b/library/Director/Db.php index 4c621501..d7c18176 100644 --- a/library/Director/Db.php +++ b/library/Director/Db.php @@ -2,10 +2,12 @@ namespace Icinga\Module\Director; +use Exception; use Icinga\Module\Director\Data\Db\DbConnection; use Icinga\Module\Director\Objects\IcingaEndpoint; use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Exception\ConfigurationError; +use RuntimeException; use Zend_Db_Expr; use Zend_Db_Select; @@ -26,6 +28,25 @@ class Db extends DbConnection return $this->getDbAdapter(); } + public function runFailSafeTransaction($callable) + { + if (! is_callable($callable)) { + throw new RuntimeException(__METHOD__ . ' needs a Callable'); + } + + $db = $this->db(); + $db->beginTransaction(); + try { + $callable(); + $db->commit(); + } catch (Exception $e) { + $db->rollback(); + throw $e; + } + + return $this; + } + public function countActivitiesSinceLastDeployedConfig(IcingaObject $object = null) { $db = $this->db(); diff --git a/library/Director/DirectorObject/Automation/ImportExport.php b/library/Director/DirectorObject/Automation/ImportExport.php index 0838ff79..09c616e1 100644 --- a/library/Director/DirectorObject/Automation/ImportExport.php +++ b/library/Director/DirectorObject/Automation/ImportExport.php @@ -100,4 +100,22 @@ class ImportExport return $res; } + + public function unserializeImportSources($objects) + { + $this->connection->runFailSafeTransaction(function () use ($objects) { + foreach ($objects as $object) { + ImportSource::import($object, $this->connection)->store(); + } + }); + } + + public function unserializeSyncRules($objects) + { + $this->connection->runFailSafeTransaction(function () use ($objects) { + foreach ($objects as $object) { + SyncRule::import($object, $this->connection)->store(); + } + }); + } }