Sync: fix loading existing templates

fixes #2217
fixes #2745
This commit is contained in:
Thomas Gelf 2023-05-11 14:57:55 +02:00
parent 623dd1cbc7
commit fb10bac7e9
3 changed files with 27 additions and 5 deletions

View File

@ -23,6 +23,7 @@ This version hasn't been released yet
### Import and Sync
* FEATURE: regular expression based modifier allows explicit NULL on no match (#2705)
* FIX: synchronizing Service (and -Set) Templates has been fixed (#2745, #2217)
### Permissions and Restrictions
* FIX: monitoring-related permission checks have been refactored (#2712)

View File

@ -452,7 +452,28 @@ class Sync
if ($this->store) {
$objects = $this->store->loadAll(DbObjectTypeRegistry::tableNameByType($ruleObjectType), 'object_name');
} else {
$objects = IcingaObject::loadAllByType($ruleObjectType, $this->db);
$keyColumn = null;
$query = null;
// We enforce named index for combined-key templates (Services and Sets) and applied Sets
if ($ruleObjectType === 'service' || $ruleObjectType === 'serviceSet') {
foreach ($this->syncProperties as $prop) {
$configuredObjectType = $prop->get('source_expression');
if ($prop->get('destination_field') === 'object_type'
&& (
$configuredObjectType === 'template'
|| ($configuredObjectType === 'apply' && $ruleObjectType === 'serviceSet')
)
) {
$keyColumn = 'object_name';
$table = $ruleObjectType === 'service'
? BranchSupport::TABLE_ICINGA_SERVICE
: BranchSupport::TABLE_ICINGA_SERVICE_SET;
$query = $this->db->getDbAdapter()->select()
->from($table)->where('object_type = ?', $configuredObjectType);
}
}
}
$objects = IcingaObject::loadAllByType($ruleObjectType, $this->db, $query, $keyColumn);
}
if ($useLowerCaseKeys) {

View File

@ -2662,16 +2662,16 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer
/** @var DbObject $class */
$class = DbObjectTypeRegistry::classByType($type);
if ($keyColumn === null && is_array($class::create()->getKeyName())) {
return $class::loadAll($db, $query);
}
if ($keyColumn === null) {
if (method_exists($class, 'getKeyColumnName')) {
$keyColumn = $class::getKeyColumnName();
}
}
if (is_array($class::create()->getKeyName())) {
return $class::loadAll($db, $query);
}
if (PrefetchCache::shouldBeUsed()
&& $query === null
&& $keyColumn === static::getKeyColumnName()