Implement Service::OnCheckResultReceived, rename ServiceStateChangeMessage to CheckResultMessage

Fixes #3597
This commit is contained in:
Gunnar Beutner 2013-01-31 16:49:40 +01:00
parent 15b260d75e
commit 070607a1d1
10 changed files with 60 additions and 49 deletions

View File

@ -40,8 +40,8 @@ void ReplicationComponent::Start(void)
boost::bind(&ReplicationComponent::RemoteObjectRemovedHandler, this, _3));
/* service status */
m_Endpoint->RegisterTopicHandler("checker::ServiceStateChange",
boost::bind(&ReplicationComponent::ServiceStateChangeRequestHandler, _3));
m_Endpoint->RegisterTopicHandler("checker::CheckResult",
boost::bind(&ReplicationComponent::CheckResultRequestHandler, _3));
}
/**
@ -52,42 +52,35 @@ void ReplicationComponent::Stop(void)
m_Endpoint->Unregister();
}
void ReplicationComponent::ServiceStateChangeRequestHandler(const RequestMessage& request)
void ReplicationComponent::CheckResultRequestHandler(const RequestMessage& request)
{
ServiceStateChangeMessage params;
CheckResultMessage params;
if (!request.GetParams(&params))
return;
String svcname;
if (!params.GetService(&svcname))
return;
String svcname = params.GetService();
Service::Ptr service = Service::GetByName(svcname);
//CheckResult cr;
//if (!params.GetCheckResult(&cr))
// return;
Service::OnCheckResultReceived(service, params);
//Service::OnCheckResultReceived(service, params);
//service->ApplyCheckResult(cr);
Dictionary::Ptr cr = params.GetCheckResult();
if (!cr)
return;
Dictionary::Ptr cr = service->GetLastCheckResult();
if (cr) {
Value active = cr->Get("active");
Value active = cr->Get("active");
time_t ts;
Value schedule_end = cr->Get("schedule_end");
time_t ts;
Value schedule_end = cr->Get("schedule_end");
if (!schedule_end.IsEmpty())
ts = static_cast<time_t>(schedule_end);
else
ts = static_cast<time_t>(Utility::GetTime());
if (!schedule_end.IsEmpty())
ts = static_cast<time_t>(schedule_end);
else
ts = static_cast<time_t>(Utility::GetTime());
if (active.IsEmpty() || static_cast<long>(active))
CIB::UpdateActiveChecksStatistics(ts, 1);
else
CIB::UpdatePassiveChecksStatistics(ts, 1);
}
if (active.IsEmpty() || static_cast<long>(active))
CIB::UpdateActiveChecksStatistics(ts, 1);
else
CIB::UpdatePassiveChecksStatistics(ts, 1);
}
void ReplicationComponent::EndpointConnectedHandler(const Endpoint::Ptr& endpoint)

View File

@ -35,7 +35,7 @@ public:
private:
Endpoint::Ptr m_Endpoint;
static void ServiceStateChangeRequestHandler(const RequestMessage& request);
static void CheckResultRequestHandler(const RequestMessage& request);
void EndpointConnectedHandler(const Endpoint::Ptr& endpoint);

View File

@ -6,6 +6,8 @@ pkglib_LTLIBRARIES = \
libicinga_la_SOURCES = \
acknowledgement.h \
checkresultmessage.cpp \
checkresultmessage.h \
cib.cpp \
cib.h \
commentprocessor.cpp \
@ -31,8 +33,6 @@ libicinga_la_SOURCES = \
servicegroup.cpp \
servicegroup.h \
service.h \
servicestatechangemessage.cpp \
servicestatechangemessage.h \
timeperiod.cpp \
timeperiod.h

View File

@ -21,13 +21,27 @@
using namespace icinga;
bool ServiceStateChangeMessage::GetService(String *service) const
String CheckResultMessage::GetService(void) const
{
return Get("service", service);
String service;
Get("service", &service);
return service;
}
void ServiceStateChangeMessage::SetService(const String& service)
void CheckResultMessage::SetService(const String& service)
{
Set("service", service);
}
Dictionary::Ptr CheckResultMessage::GetCheckResult(void) const
{
Dictionary::Ptr cr;
Get("check_result", &cr);
return cr;
}
void CheckResultMessage::SetCheckResult(const Dictionary::Ptr& result)
{
Set("check_result", result);
}

View File

@ -17,8 +17,8 @@
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
******************************************************************************/
#ifndef SERVICESTATECHANGEMESSAGE_H
#define SERVICESTATECHANGEMESSAGE_H
#ifndef CHECKRESULTMESSAGE_H
#define CHECKRESULTMESSAGE_H
namespace icinga
{
@ -28,16 +28,19 @@ namespace icinga
*
* @ingroup icinga
*/
class I2_ICINGA_API ServiceStateChangeMessage : public MessagePart
class I2_ICINGA_API CheckResultMessage : public MessagePart
{
public:
ServiceStateChangeMessage(void) : MessagePart() { }
ServiceStateChangeMessage(const MessagePart& message) : MessagePart(message) { }
CheckResultMessage(void) : MessagePart() { }
CheckResultMessage(const MessagePart& message) : MessagePart(message) { }
bool GetService(String *service) const;
String GetService(void) const;
void SetService(const String& service);
Dictionary::Ptr GetCheckResult(void) const;
void SetCheckResult(const Dictionary::Ptr& result);
};
}
#endif /* SERVICESTATECHANGEMESSAGE_H */
#endif /* CHECKRESULTMESSAGE_H */

View File

@ -61,7 +61,7 @@ using boost::algorithm::is_any_of;
#include "pluginchecktask.h"
#include "nullchecktask.h"
#include "servicestatechangemessage.h"
#include "checkresultmessage.h"
#include "cib.h"

View File

@ -19,6 +19,7 @@
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="checkresultmessage.cpp" />
<ClCompile Include="cib.cpp" />
<ClCompile Include="commentprocessor.cpp" />
<ClCompile Include="downtimeprocessor.cpp" />
@ -37,11 +38,11 @@
<ClCompile Include="nullchecktask.cpp" />
<ClCompile Include="service.cpp" />
<ClCompile Include="servicegroup.cpp" />
<ClCompile Include="servicestatechangemessage.cpp" />
<ClCompile Include="timeperiod.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="acknowledgement.h" />
<ClInclude Include="checkresultmessage.h" />
<ClInclude Include="cib.h" />
<ClInclude Include="commentprocessor.h" />
<ClInclude Include="downtimeprocessor.h" />
@ -55,7 +56,6 @@
<ClInclude Include="nullchecktask.h" />
<ClInclude Include="service.h" />
<ClInclude Include="servicegroup.h" />
<ClInclude Include="servicestatechangemessage.h" />
<ClInclude Include="timeperiod.h" />
</ItemGroup>
<PropertyGroup Label="Globals">

View File

@ -742,17 +742,19 @@ void Service::ProcessCheckResult(const Dictionary::Ptr& cr)
ApplyCheckResult(cr);
/* flush the current transaction so other instances see the service's
* new state when they receive the ServiceStateChange message */
* new state when they receive the CheckResult message */
DynamicObject::FlushTx();
RequestMessage rm;
rm.SetMethod("checker::ServiceStateChange");
rm.SetMethod("checker::CheckResult");
/* TODO: add _old_ state to message */
ServiceStateChangeMessage params;
CheckResultMessage params;
params.SetService(GetName());
params.SetCheckResult(cr);
rm.SetParams(params);
EndpointManager::GetInstance()->SendMulticastMessage(rm);
}

View File

@ -49,7 +49,6 @@ enum ServiceStateType
};
class CheckResultMessage;
class ServiceStatusMessage;
/**
* An Icinga service.

View File

@ -51,7 +51,7 @@ public:
template<typename T>
bool Get(String key, T *value) const
{
Value v =GetDictionary()->Get(key);
Value v = GetDictionary()->Get(key);
if (v.IsEmpty())
return false;