From 5d09af0a6e91ba49e99f32456f41629aee1e76f4 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 5 Aug 2013 09:37:52 +0200 Subject: [PATCH] ido: Implement servicegroup members. --- lib/icinga/servicegroup.cpp | 9 +++++-- lib/icinga/servicegroup.h | 2 ++ lib/ido/hostgroupdbobject.cpp | 2 -- lib/ido/servicegroupdbobject.cpp | 40 +++++++++++++++++++++++++++++++- lib/ido/servicegroupdbobject.h | 8 +++++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/lib/icinga/servicegroup.cpp b/lib/icinga/servicegroup.cpp index 3b4a6a02d..3f1694e17 100644 --- a/lib/icinga/servicegroup.cpp +++ b/lib/icinga/servicegroup.cpp @@ -33,6 +33,7 @@ static boost::mutex l_Mutex; static std::map > l_MembersCache; static bool l_MembersCacheNeedsUpdate = false; static Timer::Ptr l_MembersCacheTimer; +boost::signals2::signal ServiceGroup::OnMembersChanged; REGISTER_TYPE(ServiceGroup); @@ -137,6 +138,10 @@ void ServiceGroup::RefreshMembersCache(void) } } - boost::mutex::scoped_lock lock(l_Mutex); - l_MembersCache.swap(newMembersCache); + { + boost::mutex::scoped_lock lock(l_Mutex); + l_MembersCache.swap(newMembersCache); + } + + OnMembersChanged(); } diff --git a/lib/icinga/servicegroup.h b/lib/icinga/servicegroup.h index 18f6437f1..62f083859 100644 --- a/lib/icinga/servicegroup.h +++ b/lib/icinga/servicegroup.h @@ -49,6 +49,8 @@ public: static void InvalidateMembersCache(void); + static boost::signals2::signal OnMembersChanged; + protected: virtual void OnRegistrationCompleted(void); diff --git a/lib/ido/hostgroupdbobject.cpp b/lib/ido/hostgroupdbobject.cpp index 4632aaef6..a97580a10 100644 --- a/lib/ido/hostgroupdbobject.cpp +++ b/lib/ido/hostgroupdbobject.cpp @@ -73,8 +73,6 @@ void HostGroupDbObject::MembersChangedHandler(void) BOOST_FOREACH(const DynamicObject::Ptr& object, DynamicType::GetObjects("HostGroup")) { HostGroup::Ptr hg = static_pointer_cast(object); - Log(LogWarning, "ido", "HG: " + hg->GetName()); - BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) { DbQuery query2; query2.Table = DbType::GetByName("HostGroup")->GetTable() + "_members"; diff --git a/lib/ido/servicegroupdbobject.cpp b/lib/ido/servicegroupdbobject.cpp index 6437dc90b..984b38ff6 100644 --- a/lib/ido/servicegroupdbobject.cpp +++ b/lib/ido/servicegroupdbobject.cpp @@ -22,22 +22,29 @@ #include "ido/dbvalue.h" #include "icinga/servicegroup.h" #include "base/objectlock.h" +#include "base/initialize.h" #include using namespace icinga; REGISTER_DBTYPE(ServiceGroup, "servicegroup", DbObjectTypeServiceGroup, "servicegroup_object_id", ServiceGroupDbObject); +INITIALIZE_ONCE(ServiceGroupDbObject, &ServiceGroupDbObject::StaticInitialize); ServiceGroupDbObject::ServiceGroupDbObject(const DbType::Ptr& type, const String& name1, const String& name2) : DbObject(type, name1, name2) { } +void ServiceGroupDbObject::StaticInitialize(void) +{ + ServiceGroup::OnMembersChanged.connect(&ServiceGroupDbObject::MembersChangedHandler); +} + Dictionary::Ptr ServiceGroupDbObject::GetConfigFields(void) const { Dictionary::Ptr fields = boost::make_shared(); ServiceGroup::Ptr group = static_pointer_cast(GetObject()); - fields->Set("alias", Empty); + fields->Set("alias", group->GetDisplayName()); return fields; } @@ -46,3 +53,34 @@ Dictionary::Ptr ServiceGroupDbObject::GetStatusFields(void) const { return Empty; } + + +void ServiceGroupDbObject::OnConfigUpdate(void) +{ + MembersChangedHandler(); +} + +void ServiceGroupDbObject::MembersChangedHandler(void) +{ + DbQuery query1; + query1.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members"; + query1.Type = DbQueryDelete; + query1.WhereCriteria = boost::make_shared(); + query1.WhereCriteria->Set("instance_id", 0); + OnQuery(query1); + + BOOST_FOREACH(const DynamicObject::Ptr& object, DynamicType::GetObjects("ServiceGroup")) { + ServiceGroup::Ptr sg = static_pointer_cast(object); + + BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) { + DbQuery query2; + query2.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members"; + query2.Type = DbQueryInsert; + query2.Fields = boost::make_shared(); + query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ + query2.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(sg)); + query2.Fields->Set("service_object_id", service); + OnQuery(query2); + } + } +} diff --git a/lib/ido/servicegroupdbobject.h b/lib/ido/servicegroupdbobject.h index aa99917c0..229d6e28f 100644 --- a/lib/ido/servicegroupdbobject.h +++ b/lib/ido/servicegroupdbobject.h @@ -38,8 +38,16 @@ public: ServiceGroupDbObject(const DbType::Ptr& type, const String& name1, const String& name2); + static void StaticInitialize(void); + virtual Dictionary::Ptr GetConfigFields(void) const; virtual Dictionary::Ptr GetStatusFields(void) const; + +protected: + virtual void OnConfigUpdate(void); + +private: + static void MembersChangedHandler(void); }; } -- 2.40.0