diff --git a/lib/icinga/checkable-notification.cpp b/lib/icinga/checkable-notification.cpp index 7d9fcb6b1..cd0c497f4 100644 --- a/lib/icinga/checkable-notification.cpp +++ b/lib/icinga/checkable-notification.cpp @@ -173,24 +173,7 @@ static void FireSuppressedNotifications(Checkable* checkable) bool still_applies = checkable->NotificationReasonApplies(type); if (still_applies) { - bool still_suppressed; - - switch (type) { - case NotificationProblem: - /* Fall through. */ - case NotificationRecovery: - still_suppressed = !checkable->IsReachable(DependencyNotification) || checkable->IsInDowntime() || checkable->IsAcknowledged(); - break; - case NotificationFlappingStart: - /* Fall through. */ - case NotificationFlappingEnd: - still_suppressed = checkable->IsInDowntime(); - break; - default: - break; - } - - if (!still_suppressed && !checkable->IsLikelyToBeCheckedSoon() && !wasLastParentRecoveryRecent.Get()) { + if (!checkable->NotificationReasonSuppressed(type) && !checkable->IsLikelyToBeCheckedSoon() && !wasLastParentRecoveryRecent.Get()) { Checkable::OnNotificationsRequested(checkable, type, checkable->GetLastCheckResult(), "", "", nullptr); subtract |= type; @@ -258,6 +241,27 @@ bool Checkable::NotificationReasonApplies(NotificationType type) } } +/** + * Checks if notifications of a given type should be suppressed for this Checkable at the moment. + * + * @param type The notification type for which to query the suppression status. + * + * @return true if no notification of this type should be sent. + */ +bool Checkable::NotificationReasonSuppressed(NotificationType type) +{ + switch (type) { + case NotificationProblem: + case NotificationRecovery: + return !IsReachable(DependencyNotification) || IsInDowntime() || IsAcknowledged(); + case NotificationFlappingStart: + case NotificationFlappingEnd: + return IsInDowntime(); + default: + return false; + } +} + /** * E.g. we're going to re-send a stashed problem notification as *this is still not ok. * But if the next check result recovers *this soon, we would send a recovery notification soon after the problem one. diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 3248a35aa..f1dd4e6ff 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -186,6 +186,7 @@ public: void ValidateMaxCheckAttempts(const Lazy& lvalue, const ValidationUtils& value) final; bool NotificationReasonApplies(NotificationType type); + bool NotificationReasonSuppressed(NotificationType type); bool IsLikelyToBeCheckedSoon(); static void IncreasePendingChecks(); diff --git a/lib/notification/notificationcomponent.cpp b/lib/notification/notificationcomponent.cpp index b81092ff1..6e4e99168 100644 --- a/lib/notification/notificationcomponent.cpp +++ b/lib/notification/notificationcomponent.cpp @@ -91,7 +91,7 @@ void FireSuppressedNotifications(const Notification::Ptr& notification) if ((!tp || tp->IsInside(Utility::GetTime())) && !checkable->IsLikelyToBeCheckedSoon()) { for (auto type : {NotificationProblem, NotificationRecovery, NotificationFlappingStart, NotificationFlappingEnd}) { - if (!(suppressedTypes & type)) + if (!(suppressedTypes & type) || checkable->NotificationReasonSuppressed(type)) continue; auto notificationName (notification->GetName());