diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index bda0e336b..ff3c6506d 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -55,6 +55,8 @@ Dictionary::Ptr ApiActions::CreateResult(int code, const String& status, Dictionary::Ptr ApiActions::ProcessCheckResult(const ConfigObject::Ptr& object, const Dictionary::Ptr& params) { + using Result = Checkable::ProcessingResult; + Checkable::Ptr checkable = static_pointer_cast(object); if (!checkable) @@ -123,9 +125,19 @@ Dictionary::Ptr ApiActions::ProcessCheckResult(const ConfigObject::Ptr& object, if (params->Contains("ttl")) cr->SetTtl(HttpUtility::GetLastParameter(params, "ttl")); - checkable->ProcessCheckResult(cr); + Result result = checkable->ProcessCheckResult(cr); + switch (result) { + case Result::Ok: + return ApiActions::CreateResult(200, "Successfully processed check result for object '" + checkable->GetName() + "'."); + case Result::NoCheckResult: + return ApiActions::CreateResult(400, "Could not process check result for object '" + checkable->GetName() + "' because no check result was passed."); + case Result::CheckableInactive: + return ApiActions::CreateResult(503, "Could not process check result for object '" + checkable->GetName() + "' because the object is inactive."); + case Result::NewerCheckResultPresent: + return ApiActions::CreateResult(409, "Newer check result already present. Check result for '" + checkable->GetName() + "' was discarded."); + } - return ApiActions::CreateResult(200, "Successfully processed check result for object '" + checkable->GetName() + "'."); + return ApiActions::CreateResult(500, "Unexpected result (" + std::to_string(static_cast(result)) + ") for object '" + checkable->GetName() + "'. Please submit a bug report at https://github.com/Icinga/icinga2"); } Dictionary::Ptr ApiActions::RescheduleCheck(const ConfigObject::Ptr& object, diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index a302bd923..921231a9e 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -94,15 +94,17 @@ double Checkable::GetLastCheck() const return schedule_end; } -void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrigin::Ptr& origin) +Checkable::ProcessingResult Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrigin::Ptr& origin) { + using Result = Checkable::ProcessingResult; + { ObjectLock olock(this); m_CheckRunning = false; } if (!cr) - return; + return Result::NoCheckResult; double now = Utility::GetTime(); @@ -142,12 +144,12 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig listener->SyncSendMessage(command_endpoint, message); } - return; + return Result::Ok; } if (!IsActive()) - return; + return Result::CheckableInactive; bool reachable = IsReachable(); bool notification_reachable = IsReachable(DependencyNotification); @@ -184,7 +186,7 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", newCRTimestamp) << " (" << newCRTimestamp << "). It is in the past compared to ours at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", currentCRTimestamp) << " (" << currentCRTimestamp << ")."; - return; + return Result::NewerCheckResultPresent; } } } @@ -526,6 +528,8 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig /* update reachability for child objects */ if ((stateChange || hardChange) && !children.empty()) OnReachabilityChanged(this, cr, children, origin); + + return Result::Ok; } void Checkable::ExecuteRemoteCheck(const Dictionary::Ptr& resolvedMacros) diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index bb8e567b4..6a46425a9 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -111,7 +111,14 @@ public: void ExecuteRemoteCheck(const Dictionary::Ptr& resolvedMacros = nullptr); void ExecuteCheck(); - void ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrigin::Ptr& origin = nullptr); + enum class ProcessingResult + { + Ok, + NoCheckResult, + CheckableInactive, + NewerCheckResultPresent, + }; + ProcessingResult ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrigin::Ptr& origin = nullptr); Endpoint::Ptr GetCommandEndpoint() const;