summaryrefslogtreecommitdiffstats
path: root/library/Director/Repository/IcingaTemplateRepository.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/Director/Repository/IcingaTemplateRepository.php122
1 files changed, 122 insertions, 0 deletions
diff --git a/library/Director/Repository/IcingaTemplateRepository.php b/library/Director/Repository/IcingaTemplateRepository.php
new file mode 100644
index 0000000..ed3b1d0
--- /dev/null
+++ b/library/Director/Repository/IcingaTemplateRepository.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Icinga\Module\Director\Repository;
+
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Resolver\TemplateTree;
+
+class IcingaTemplateRepository
+{
+ use RepositoryByObjectHelper;
+
+ /** @var TemplateTree */
+ protected $tree;
+
+ protected $loadedById = [];
+
+ /**
+ * @return TemplateTree
+ */
+ public function tree()
+ {
+ if ($this->tree === null) {
+ $this->tree = new TemplateTree($this->type, $this->connection);
+ }
+
+ return $this->tree;
+ }
+
+ /**
+ * @param IcingaObject $object
+ * @param bool $recursive
+ * @return IcingaObject[]
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function getTemplatesFor(IcingaObject $object, $recursive = false)
+ {
+ if ($recursive) {
+ $ids = $this->tree()->listAncestorIdsFor($object);
+ } else {
+ $ids = $this->tree()->listParentIdsFor($object);
+ }
+
+ return $this->getTemplatesForIds($ids, $object);
+ }
+
+ /**
+ * @param array $ids
+ * @param IcingaObject $object
+ * @return IcingaObject[]
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function getTemplatesForIds(array $ids, IcingaObject $object)
+ {
+ $templates = [];
+ foreach ($ids as $id) {
+ if (! array_key_exists($id, $this->loadedById)) {
+ // TODO: load only missing ones at once
+ $this->loadedById[$id] = $object::loadWithAutoIncId(
+ $id,
+ $this->connection
+ );
+ }
+
+ $templates[$id] = $this->loadedById[$id];
+ }
+
+ return $templates;
+ }
+
+ /**
+ * @param IcingaObject $object
+ * @param bool $recursive
+ * @return IcingaObject[]
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function getTemplatesIndexedByNameFor(
+ IcingaObject $object,
+ $recursive = false
+ ) {
+ $templates = [];
+ foreach ($this->getTemplatesFor($object, $recursive) as $template) {
+ $templates[$template->getObjectName()] = $template;
+ }
+
+ return $templates;
+ }
+
+ public function persistImportNames()
+ {
+ }
+
+ public function storeChances(Db $db)
+ {
+ }
+
+ public function listAllowedTemplateNames()
+ {
+ $type = $this->type;
+ $db = $this->connection->getDbAdapter();
+ $table = 'icinga_' . $this->type;
+
+ $query = $db->select()
+ ->from($table, 'object_name')
+ ->order('object_name');
+
+ if ($type !== 'command') {
+ $query->where('object_type = ?', 'template');
+ }
+
+ if (in_array($type, ['host', 'service'])) {
+ $query->where('template_choice_id IS NULL');
+ }
+
+ return $db->fetchCol($query);
+ }
+
+ public static function clear()
+ {
+ static::clearInstances();
+ }
+}