Module: check_mk
Branch: master
Commit: ea9ac8e82ec30fa1783fb4655eae69d949a8b007
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=ea9ac8e82ec30f…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Sat Mar 30 21:41:37 2019 +0100
Improve predefined condition usage
* Add option to search for predefined condition usage in the rule search
* Add icon button to the predefined condition list to open a rule search
for the choosen predefined condition. This can be useful to find all
rules refering to a predefined condition.
* Prevent deletion of a predefined condition in case it is still used by
rules.
Change-Id: Ie36d57de1dc14d45185622cd0834ba786e907284
---
cmk/gui/plugins/wato/utils/simple_modes.py | 6 +++++
cmk/gui/wato/pages/predefined_conditions.py | 34 +++++++++++++++++++++++------
cmk/gui/wato/pages/rulesets.py | 14 +++++++-----
cmk/gui/watolib/predefined_conditions.py | 4 ++++
cmk/gui/watolib/rulesets.py | 4 ++++
5 files changed, 49 insertions(+), 13 deletions(-)
diff --git a/cmk/gui/plugins/wato/utils/simple_modes.py
b/cmk/gui/plugins/wato/utils/simple_modes.py
index 2b92361..007e6af 100644
--- a/cmk/gui/plugins/wato/utils/simple_modes.py
+++ b/cmk/gui/plugins/wato/utils/simple_modes.py
@@ -218,6 +218,8 @@ class SimpleListMode(SimpleWatoModeBase):
raise MKUserError("_delete", \
_("You are not allowed to delete this %s.") %
self._mode_type.name_singular())
+ self._validate_deletion(ident, entries[ident])
+
entry = entries.pop(ident)
self._add_change("delete", entry,
_("Removed the %s '%s'") %
(self._mode_type.name_singular(), ident))
@@ -225,6 +227,10 @@ class SimpleListMode(SimpleWatoModeBase):
return None, _("The %s has been deleted.") %
self._mode_type.name_singular()
+ def _validate_deletion(self, ident, entry):
+ """Override this to implement custom
validations"""
+ pass
+
def _delete_confirm_message(self):
return _("Do you really want to delete this %s?") %
self._mode_type.name_singular()
diff --git a/cmk/gui/wato/pages/predefined_conditions.py
b/cmk/gui/wato/pages/predefined_conditions.py
index 5eb2689..6f812cf 100644
--- a/cmk/gui/wato/pages/predefined_conditions.py
+++ b/cmk/gui/wato/pages/predefined_conditions.py
@@ -27,6 +27,7 @@
import cmk.gui.config as config
import cmk.gui.userdb as userdb
+from cmk.gui.exceptions import MKUserError
from cmk.gui.i18n import _
from cmk.gui.globals import html
from cmk.gui.valuespec import (
@@ -39,6 +40,7 @@ from cmk.gui.valuespec import (
from cmk.gui.plugins.wato.check_mk_configuration import RulespecGroupUserInterface
from cmk.gui.wato.pages.rulesets import VSExplicitConditions, RuleConditions
+from cmk.gui.watolib.rulesets import AllRulesets, SearchedRulesets
from cmk.gui.watolib.rulespecs import ServiceRulespec
from cmk.gui.watolib.groups import load_contact_group_information
from cmk.gui.watolib.predefined_conditions import PredefinedConditionStore
@@ -109,13 +111,18 @@ class ModePredefinedConditions(SimpleListMode):
def _table_title(self):
return _("Predefined conditions")
- # TODO: Can we validate predefined condition usage and prevent deletion?
- def _delete_confirm_message(self):
- return " ".join([
- _("The password may be used in checks. If you delete the password,
"
- "the checks won't be able to authenticate with this password
anymore."),
- super(ModePredefinedConditions, self)._delete_confirm_message()
- ])
+ def _validate_deletion(self, ident, entry):
+ rulesets = AllRulesets()
+ rulesets.load()
+ matched_rulesets = SearchedRulesets(rulesets, {
+ "rule_predefined_condition": ident
+ }).get_rulesets()
+
+ if matched_rulesets:
+ raise MKUserError(
+ "_delete",
+ _("You can not delete this %s because it is <a
href=\"%s\">in use</a>.") %
+ (self._mode_type.name_singular(), self._search_url(ident)))
def page(self):
html.p(
@@ -125,6 +132,19 @@ class ModePredefinedConditions(SimpleListMode):
"rulesets."))
super(ModePredefinedConditions, self).page()
+ def _show_action_cell(self, table, ident):
+ super(ModePredefinedConditions, self)._show_action_cell(table, ident)
+
+ html.icon_button(
+ self._search_url(ident),
+ _("Show rules using this %s") % self._mode_type.name_singular(),
"search")
+
+ def _search_url(self, ident):
+ return html.makeuri_contextless([("mode", "rulesets"),
+
("search_p_rule_predefined_condition",
+ DropdownChoice.option_id(ident)),
+
("search_p_rule_predefined_condition_USE", "on")])
+
def _show_entry_cells(self, table, ident, entry):
table.cell(_("Title"), html.render_text(entry["title"]))
diff --git a/cmk/gui/wato/pages/rulesets.py b/cmk/gui/wato/pages/rulesets.py
index 95eea180..114b8bf 100644
--- a/cmk/gui/wato/pages/rulesets.py
+++ b/cmk/gui/wato/pages/rulesets.py
@@ -953,6 +953,7 @@ class ModeRuleSearch(WatoMode):
"rule_disabled",
"rule_ineffective",
"rule_folder",
+ "rule_predefined_condition",
]),
],
elements=[
@@ -1066,6 +1067,12 @@ class ModeRuleSearch(WatoMode):
),
],
)),
+ ("rule_predefined_condition",
+ DropdownChoice(
+ title=_("Using predefined condition"),
+ choices=PredefinedConditionStore().choices(),
+ sorted=True,
+ )),
],
)
@@ -1339,7 +1346,7 @@ class EditRuleMode(WatoMode):
url = watolib.folder_preserving_link([("mode",
"predefined_conditions")])
return DropdownChoice(
title=_("Predefined condition"),
- choices=self._predefined_condition_choices,
+ choices=PredefinedConditionStore().choices(),
sorted=True,
invalid_choice="complain",
invalid_choice_title=_(
@@ -1350,11 +1357,6 @@ class EditRuleMode(WatoMode):
empty_text=(_("There are no elements defined for this selection
yet.") + " " +
_("You can create predefined conditions <a
href=\"%s\">here</a>.") % url))
- def _predefined_condition_choices(self):
- store = PredefinedConditionStore()
- return [(ident, entry["title"])
- for ident, entry in
store.filter_usable_entries(store.load_for_reading()).items()]
-
def _show_explicit_conditions(self):
conditions = RuleConditions(
folder_path=self._folder.path(),
diff --git a/cmk/gui/watolib/predefined_conditions.py
b/cmk/gui/watolib/predefined_conditions.py
index 403c5c3..93a3095 100644
--- a/cmk/gui/watolib/predefined_conditions.py
+++ b/cmk/gui/watolib/predefined_conditions.py
@@ -55,3 +55,7 @@ class PredefinedConditionStore(WatoSimpleConfigFile):
user_groups = userdb.contactgroups_of_user(config.user.id)
return dict([(k, v) for k, v in entries.items() if v["owned_by"] in
user_groups])
+
+ def choices(self):
+ return [(ident, entry["title"])
+ for ident, entry in
self.filter_usable_entries(self.load_for_reading()).items()]
diff --git a/cmk/gui/watolib/rulesets.py b/cmk/gui/watolib/rulesets.py
index 6b663dc..5bc6969 100644
--- a/cmk/gui/watolib/rulesets.py
+++ b/cmk/gui/watolib/rulesets.py
@@ -834,6 +834,10 @@ class Rule(object):
"rule_disabled"] != self.is_disabled():
return False
+ if "rule_predefined_condition" in search_options and search_options[
+ "rule_predefined_condition"] !=
self.predefined_condition_id():
+ return False
+
if "rule_ineffective" in search_options and search_options[
"rule_ineffective"] != self.is_ineffective():
return False