DirectorDatafieldForm: allow to wipe all related...

...custom variables when removing a field

fixes #12916
This commit is contained in:
Thomas Gelf 2016-10-13 14:02:51 +00:00
parent 7b5468a263
commit 71b3459540
3 changed files with 103 additions and 0 deletions

View File

@ -3,6 +3,7 @@
namespace Icinga\Module\Director\Forms;
use Icinga\Exception\ConfigurationError;
use Icinga\Module\Director\CustomVariable\CustomVariables;
use Icinga\Module\Director\Web\Form\DirectorObjectForm;
use Icinga\Application\Hook;
use Exception;
@ -11,6 +12,65 @@ class DirectorDatafieldForm extends DirectorObjectForm
{
protected $objectName = 'Data field';
protected function onRequest()
{
if ($this->hasBeenSent()) {
if ($this->shouldBeDeleted()) {
$varname = $this->getSentValue('varname');
if ($cnt = CustomVariables::countAll($varname, $this->getDb())) {
$this->askForVariableDeletion($varname, $cnt);
}
}
}
return parent::onRequest();
}
protected function askForVariableDeletion($varname, $cnt)
{
$msg = $this->translate(
'Leaving custom variables in place while removing the related field is'
. ' perfectly legal and might be a desired operation. This way you can'
. ' no longer modify related custom variables in the Director GUI, but'
. ' the variables themselves will stay there and continue to be deployed.'
. ' When you re-add a field for the same variable later on, everything'
. ' will continue to work as before'
);
$this->addBoolean('wipe_vars', array(
'label' => $this->translate('Wipe related vars'),
'description' => sprintf($msg, $this->getSentValue('varname')),
'required' => true,
));
if ($wipe = $this->getSentValue('wipe_vars')) {
if ($wipe === 'y') {
CustomVariables::deleteAll($varname, $this->getDb());
}
} else {
$this->abortDeletion();
$this->addError(
sprintf(
$this->translate('Also wipe all "%s" custom variables from %d objects?'),
$varname,
$cnt
)
);
$this->getElement('wipe_vars')->addError(
sprintf(
$this->translate(
'There are %d objects with a related property. Should I also'
. ' remove the "%s" property from them?'
),
$cnt,
$varname
)
);
}
}
public function setup()
{
$this->addHtmlHint(

View File

@ -2,6 +2,7 @@
namespace Icinga\Module\Director\CustomVariable;
use Icinga\Module\Director\Db;
use Icinga\Module\Director\IcingaConfig\IcingaConfigHelper as c;
use Icinga\Module\Director\IcingaConfig\IcingaConfigRenderer;
use Icinga\Module\Director\Objects\IcingaObject;
@ -20,6 +21,41 @@ class CustomVariables implements Iterator, Countable, IcingaConfigRenderer
protected $idx = array();
protected static $allTables = array(
'icinga_command_var',
'icinga_host_var',
'icinga_notification_var',
'icinga_service_var',
'icinga_user_var',
);
public static function countAll($varname, Db $connection)
{
$db = $connection->getDbAdapter();
$parts = array();
$where = $db->quoteInto('varname = ?', $varname);
foreach (static::$allTables as $table) {
$parts[] = sprintf(
'SELECT COUNT(*) as cnt FROM icinga_host_var WHERE %s',
$where
);
}
$query = 'SELECT SUM(cnt) AS cnt FROM ('
. implode(' UNION ALL ', $parts)
. ') sub';
return (int) $db->fetchOne($query);
}
public static function deleteAll($varname, Db $connection)
{
$db = $connection->getDbAdapter();
$where = $db->quoteInto('varname = ?', $varname);
foreach (static::$allTables as $table) {
$db->delete($table, $where);
}
}
public function count()
{
$count = 0;

View File

@ -943,6 +943,13 @@ abstract class DirectorObjectForm extends QuickForm
return $this->getSentValue($name) === $this->getElement($name)->getLabel();
}
protected function abortDeletion()
{
if ($this->hasDeleteButton()) {
$this->setSentValue($this->deleteButtonName, 'ABORTED');
}
}
public function getSentOrResolvedObjectValue($name, $default = null)
{
return $this->getSentOrObjectValue($name, $default, true);