]> granicus.if.org Git - icinga2/commitdiff
IDO: Add basic host/service dependency support.
authorMichael Friedrich <michael.friedrich@netways.de>
Mon, 5 Aug 2013 15:25:40 +0000 (17:25 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Mon, 5 Aug 2013 15:25:40 +0000 (17:25 +0200)
refs #4378

lib/ido/hostdbobject.cpp
lib/ido/servicedbobject.cpp

index a6b6c22696d9ec53c1576589e85322d42dfa12f0..97baad40bc520cc1f1cde8b3f8ccbf06bca67272 100644 (file)
@@ -191,28 +191,46 @@ void HostDbObject::OnConfigUpdate(void)
 {
        Host::Ptr host = static_pointer_cast<Host>(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<Dictionary>();
-       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<Dictionary>();
+       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<Dictionary>();
+       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<Dictionary>();
-               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<Dictionary>();
+               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<Dictionary>();
+               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);
        }
 }
index 2037c1ef0bfae54dcbf67825df855680ed7a5409..3b8f2b1800d6523c6549530177c77cc24ecfd3c4 100644 (file)
@@ -26,6 +26,7 @@
 #include "icinga/checkcommand.h"
 #include "icinga/eventcommand.h"
 #include "icinga/compatutility.h"
+#include <boost/foreach.hpp>
 
 using namespace icinga;
 
@@ -167,6 +168,34 @@ bool ServiceDbObject::IsStatusAttribute(const String& attribute) const
 void ServiceDbObject::OnConfigUpdate(void)
 {
        Service::Ptr service = static_pointer_cast<Service>(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<Dictionary>();
+       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<Dictionary>();
+                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)