From: Michael Friedrich Date: Mon, 5 Aug 2013 15:25:40 +0000 (+0200) Subject: IDO: Add basic host/service dependency support. X-Git-Tag: v0.0.3~734 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=662130f47e6a3237f5bb75df79383f04f04df974;p=icinga2 IDO: Add basic host/service dependency support. refs #4378 --- diff --git a/lib/ido/hostdbobject.cpp b/lib/ido/hostdbobject.cpp index a6b6c2269..97baad40b 100644 --- a/lib/ido/hostdbobject.cpp +++ b/lib/ido/hostdbobject.cpp @@ -191,28 +191,46 @@ void HostDbObject::OnConfigUpdate(void) { Host::Ptr host = static_pointer_cast(GetObject()); - /* parents: host_id, parent_host_object_id */ - - /* delete possible definitions - TODO do that on startup */ - DbQuery query1; - query1.Table = GetType()->GetTable() + "_parenthosts"; - query1.Type = DbQueryDelete; - query1.WhereCriteria = boost::make_shared(); - query1.WhereCriteria->Set(GetType()->GetTable() + "_id", DbValue::FromObjectInsertID(GetObject())); - OnQuery(query1); + /* safety delete */ + DbQuery query_del1; + query_del1.Table = GetType()->GetTable() + "_parenthosts"; + query_del1.Type = DbQueryDelete; + query_del1.WhereCriteria = boost::make_shared(); + query_del1.WhereCriteria->Set(GetType()->GetTable() + "_id", DbValue::FromObjectInsertID(GetObject())); + OnQuery(query_del1); + + DbQuery query_del2; + query_del2.Table = GetType()->GetTable() + "dependencies"; + query_del2.Type = DbQueryDelete; + query_del2.WhereCriteria = boost::make_shared(); + query_del2.WhereCriteria->Set("dependent_host_object_id", host); + OnQuery(query_del2); BOOST_FOREACH(const Host::Ptr& parent, host->GetParentHosts()) { Log(LogDebug, "ido", "host parents: " + parent->GetName()); - Dictionary::Ptr fields = boost::make_shared(); - fields->Set(GetType()->GetTable() + "_id", DbValue::FromObjectInsertID(GetObject())); - fields->Set("parent_host_object_id", parent); - fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ + /* parents: host_id, parent_host_object_id */ + Dictionary::Ptr fields1 = boost::make_shared(); + fields1->Set(GetType()->GetTable() + "_id", DbValue::FromObjectInsertID(GetObject())); + fields1->Set("parent_host_object_id", parent); + fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */ + + DbQuery query1; + query1.Table = GetType()->GetTable() + "_parenthosts"; + query1.Type = DbQueryInsert; + query1.Fields = fields1; + OnQuery(query1); + + /* host dependencies */ + Dictionary::Ptr fields2 = boost::make_shared(); + fields2->Set("host_object_id", parent); + fields2->Set("dependent_host_object_id", host); + fields2->Set("instance_id", 0); /* DbConnection class fills in real ID */ DbQuery query2; - query2.Table = GetType()->GetTable() + "_parenthosts"; + query2.Table = GetType()->GetTable() + "dependencies"; query2.Type = DbQueryInsert; - query2.Fields = fields; + query2.Fields = fields2; OnQuery(query2); } } diff --git a/lib/ido/servicedbobject.cpp b/lib/ido/servicedbobject.cpp index 2037c1ef0..3b8f2b180 100644 --- a/lib/ido/servicedbobject.cpp +++ b/lib/ido/servicedbobject.cpp @@ -26,6 +26,7 @@ #include "icinga/checkcommand.h" #include "icinga/eventcommand.h" #include "icinga/compatutility.h" +#include using namespace icinga; @@ -167,6 +168,34 @@ bool ServiceDbObject::IsStatusAttribute(const String& attribute) const void ServiceDbObject::OnConfigUpdate(void) { Service::Ptr service = static_pointer_cast(GetObject()); + + /* service dependencies */ + Log(LogDebug, "ido", "service dependencies for '" + service->GetName() + "'"); + + DbQuery query_del1; + query_del1.Table = GetType()->GetTable() + "dependencies"; + query_del1.Type = DbQueryDelete; + query_del1.WhereCriteria = boost::make_shared(); + query_del1.WhereCriteria->Set("dependent_service_object_id", service); + OnQuery(query_del1); + + BOOST_FOREACH(const Service::Ptr& parent, service->GetParentServices()) { + Log(LogDebug, "ido", "service parents: " + parent->GetName()); + + /* service dependencies */ + Dictionary::Ptr fields1 = boost::make_shared(); + fields1->Set("service_object_id", parent); + fields1->Set("dependent_service_object_id", service); + fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */ + + DbQuery query1; + query1.Table = GetType()->GetTable() + "dependencies"; + query1.Type = DbQueryInsert; + query1.Fields = fields1; + OnQuery(query1); + } + + /* service host config update */ Host::Ptr host = service->GetHost(); if (!host)