From 885f1834f15db8ac5e0402adedd1384c7b3af153 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 23 Apr 2012 16:49:02 +0200 Subject: [PATCH] Added discovery component. --- components/configrpc/configrpccomponent.cpp | 9 ++- icinga/authenticationcomponent.cpp | 8 ++- icinga/discoverycomponent.cpp | 70 +++++++++++++++++++++ icinga/discoverycomponent.h | 27 ++++++++ icinga/endpoint.cpp | 4 ++ icinga/endpoint.h | 2 + icinga/i2-icinga.h | 1 + icinga/icinga.vcxproj | 2 + 8 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 icinga/discoverycomponent.cpp create mode 100644 icinga/discoverycomponent.h diff --git a/components/configrpc/configrpccomponent.cpp b/components/configrpc/configrpccomponent.cpp index 9fd60bec8..062070f23 100644 --- a/components/configrpc/configrpccomponent.cpp +++ b/components/configrpc/configrpccomponent.cpp @@ -56,7 +56,9 @@ int ConfigRpcComponent::NewEndpointHandler(const NewEndpointEventArgs& ea) if (ea.Endpoint->HasIdentity()) { JsonRpcRequest request; request.SetMethod("config::FetchObjects"); - ea.Endpoint->ProcessRequest(m_ConfigRpcEndpoint, request); + + EndpointManager::Ptr endpointManager = GetIcingaApplication()->GetEndpointManager(); + endpointManager->SendUnicastRequest(m_ConfigRpcEndpoint, ea.Endpoint, request); } return 0; @@ -111,7 +113,10 @@ int ConfigRpcComponent::FetchObjectsHandler(const NewRequestEventArgs& ea) if (!ShouldReplicateObject(object)) continue; - client->ProcessRequest(m_ConfigRpcEndpoint, MakeObjectMessage(object, "config::ObjectCreated", true)); + JsonRpcRequest request = MakeObjectMessage(object, "config::ObjectCreated", true); + + EndpointManager::Ptr endpointManager = GetIcingaApplication()->GetEndpointManager(); + endpointManager->SendUnicastRequest(m_ConfigRpcEndpoint, client, request); } } diff --git a/icinga/authenticationcomponent.cpp b/icinga/authenticationcomponent.cpp index 3adff23cf..f5b0ec217 100644 --- a/icinga/authenticationcomponent.cpp +++ b/icinga/authenticationcomponent.cpp @@ -16,6 +16,7 @@ void AuthenticationComponent::Start(void) { m_AuthenticationEndpoint = make_shared(); m_AuthenticationEndpoint->RegisterMethodHandler("auth::SetIdentity", bind_weak(&AuthenticationComponent::IdentityMessageHandler, shared_from_this())); + m_AuthenticationEndpoint->RegisterMethodSource("auth::Welcome"); EndpointManager::Ptr mgr = GetIcingaApplication()->GetEndpointManager(); mgr->OnNewEndpoint += bind_weak(&AuthenticationComponent::NewEndpointHandler, shared_from_this()); @@ -48,7 +49,8 @@ int AuthenticationComponent::NewEndpointHandler(const NewEndpointEventArgs& neea params.SetIdentity("keks"); request.SetParams(params); - neea.Endpoint->ProcessRequest(m_AuthenticationEndpoint, request); + EndpointManager::Ptr endpointManager = GetIcingaApplication()->GetEndpointManager(); + endpointManager->SendUnicastRequest(m_AuthenticationEndpoint, neea.Endpoint, request); return 0; } @@ -70,7 +72,9 @@ int AuthenticationComponent::IdentityMessageHandler(const NewRequestEventArgs& n /* there's no authentication for now, just tell them it's ok to send messages */ JsonRpcRequest request; request.SetMethod("auth::Welcome"); - nrea.Sender->ProcessRequest(m_AuthenticationEndpoint, request); + + EndpointManager::Ptr endpointManager = GetIcingaApplication()->GetEndpointManager(); + endpointManager->SendUnicastRequest(m_AuthenticationEndpoint, nrea.Sender, request); return 0; } diff --git a/icinga/discoverycomponent.cpp b/icinga/discoverycomponent.cpp new file mode 100644 index 000000000..31667bd39 --- /dev/null +++ b/icinga/discoverycomponent.cpp @@ -0,0 +1,70 @@ +#include "i2-icinga.h" + +using namespace icinga; + +IcingaApplication::Ptr DiscoveryComponent::GetIcingaApplication(void) const +{ + return static_pointer_cast(GetApplication()); +} + +string DiscoveryComponent::GetName(void) const +{ + return "discoverycomponent"; +} + +void DiscoveryComponent::Start(void) +{ + m_DiscoveryEndpoint = make_shared(); + m_DiscoveryEndpoint->RegisterMethodSource("discovery::PeerAvailable"); + m_DiscoveryEndpoint->RegisterMethodHandler("auth::Welcome", + bind_weak(&DiscoveryComponent::WelcomeMessageHandler, shared_from_this())); + m_DiscoveryEndpoint->RegisterMethodHandler("discovery::GetPeers", + bind_weak(&DiscoveryComponent::GetPeersMessageHandler, shared_from_this())); + + EndpointManager::Ptr mgr = GetIcingaApplication()->GetEndpointManager(); + mgr->RegisterEndpoint(m_DiscoveryEndpoint); +} + +void DiscoveryComponent::Stop(void) +{ + IcingaApplication::Ptr app = GetIcingaApplication(); + + if (app) { + EndpointManager::Ptr mgr = app->GetEndpointManager(); + mgr->UnregisterEndpoint(m_DiscoveryEndpoint); + } +} + +int DiscoveryComponent::NewEndpointHandler(const NewEndpointEventArgs& neea) +{ + neea.Endpoint->OnIdentityChanged += bind_weak(&DiscoveryComponent::IdentityChangedHandler, shared_from_this()); + + /* TODO: register handler for new sink/source */ + + return 0; +} + +int DiscoveryComponent::IdentityChangedHandler(const EventArgs& neea) +{ + /* TODO: send information about this client to all other clients */ + + return 0; +} + +int DiscoveryComponent::WelcomeMessageHandler(const NewRequestEventArgs& nrea) +{ + JsonRpcRequest request; + request.SetMethod("discovery::GetPeers"); + + EndpointManager::Ptr endpointManager = GetIcingaApplication()->GetEndpointManager(); + endpointManager->SendUnicastRequest(m_DiscoveryEndpoint, nrea.Sender, request); + + return 0; +} + +int DiscoveryComponent::GetPeersMessageHandler(const NewRequestEventArgs& nrea) +{ + /* TODO: send information about all available clients to this client */ + + return 0; +} diff --git a/icinga/discoverycomponent.h b/icinga/discoverycomponent.h new file mode 100644 index 000000000..20ec3b560 --- /dev/null +++ b/icinga/discoverycomponent.h @@ -0,0 +1,27 @@ +#ifndef DISCOVERYCOMPONENT_H +#define DISCOVERYCOMPONENT_H + +namespace icinga +{ + +class DiscoveryComponent : public Component +{ +private: + VirtualEndpoint::Ptr m_DiscoveryEndpoint; + + IcingaApplication::Ptr GetIcingaApplication(void) const; + + int NewEndpointHandler(const NewEndpointEventArgs& neea); + int IdentityChangedHandler(const EventArgs& neea); + int WelcomeMessageHandler(const NewRequestEventArgs& nrea); + int GetPeersMessageHandler(const NewRequestEventArgs& nrea); + +public: + virtual string GetName(void) const; + virtual void Start(void); + virtual void Stop(void); +}; + +} + +#endif /* DISCOVERYCOMPONENT_H */ diff --git a/icinga/endpoint.cpp b/icinga/endpoint.cpp index 38f6f8148..981650329 100644 --- a/icinga/endpoint.cpp +++ b/icinga/endpoint.cpp @@ -10,6 +10,10 @@ string Endpoint::GetIdentity(void) const void Endpoint::SetIdentity(string identity) { m_Identity = identity; + + EventArgs ea; + ea.Source = shared_from_this(); + OnIdentityChanged(ea); } bool Endpoint::HasIdentity(void) const diff --git a/icinga/endpoint.h b/icinga/endpoint.h index 317cbd956..1980fdd48 100644 --- a/icinga/endpoint.h +++ b/icinga/endpoint.h @@ -64,6 +64,8 @@ public: int CountMethodSinks(void) const; int CountMethodSources(void) const; + + Event OnIdentityChanged; }; } diff --git a/icinga/i2-icinga.h b/icinga/i2-icinga.h index ed01699dc..0cd6c511e 100644 --- a/icinga/i2-icinga.h +++ b/icinga/i2-icinga.h @@ -20,5 +20,6 @@ #include "subscriptionmessage.h" #include "authenticationcomponent.h" #include "identitymessage.h" +#include "discoverycomponent.h" #endif /* I2ICINGA_H */ diff --git a/icinga/icinga.vcxproj b/icinga/icinga.vcxproj index e7f0406fb..829cc38ac 100644 --- a/icinga/icinga.vcxproj +++ b/icinga/icinga.vcxproj @@ -12,6 +12,7 @@ + @@ -23,6 +24,7 @@ + -- 2.40.0