Skip to content

Commit

Permalink
Implement GetAllChildren() for dependency resolution
Browse files Browse the repository at this point in the history
refs #10896
refs #10897
  • Loading branch information
Michael Friedrich authored and gunnarbeutner committed Nov 2, 2016
1 parent 86f162a commit ea1f872
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
30 changes: 30 additions & 0 deletions lib/icinga/checkable-dependency.cpp
Expand Up @@ -128,3 +128,33 @@ std::set<Checkable::Ptr> Checkable::GetChildren(void) const

return parents;
}

std::set<Checkable::Ptr> Checkable::GetAllChildren(void) const
{
std::set<Checkable::Ptr> children = GetChildren();

GetAllChildrenInternal(children, 0);

return children;
}

void Checkable::GetAllChildrenInternal(std::set<Checkable::Ptr>& children, int level) const
{
if (level > 32)
return;

std::set<Checkable::Ptr> localChildren;

for (const Checkable::Ptr& checkable : children) {
std::set<Checkable::Ptr> cChildren = checkable->GetChildren();

if (!checkable->GetChildren().empty()) {
GetAllChildrenInternal(cChildren, level + 1);
localChildren.insert(cChildren.begin(), cChildren.end());
}

localChildren.insert(checkable);
}

children.insert(localChildren.begin(), localChildren.end());
}
3 changes: 3 additions & 0 deletions lib/icinga/checkable.hpp
Expand Up @@ -74,6 +74,7 @@ class I2_ICINGA_API Checkable : public ObjectImpl<Checkable>

std::set<Checkable::Ptr> GetParents(void) const;
std::set<Checkable::Ptr> GetChildren(void) const;
std::set<Checkable::Ptr> GetAllChildren(void) const;

void AddGroup(const String& name);

Expand Down Expand Up @@ -217,6 +218,8 @@ class I2_ICINGA_API Checkable : public ObjectImpl<Checkable>
mutable boost::mutex m_DependencyMutex;
std::set<intrusive_ptr<Dependency> > m_Dependencies;
std::set<intrusive_ptr<Dependency> > m_ReverseDependencies;

void GetAllChildrenInternal(std::set<Checkable::Ptr>& children, int level = 0) const;
};

}
Expand Down
4 changes: 2 additions & 2 deletions lib/icinga/externalcommandprocessor.cpp
Expand Up @@ -1024,7 +1024,7 @@ void ExternalCommandProcessor::ScheduleAndPropagateHostDowntime(double, const st
Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5]));

/* Schedule downtime for all child hosts */
BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) {
for (const Checkable::Ptr& child : host->GetAllChildren()) {
Host::Ptr host;
Service::Ptr service;
tie(host, service) = GetHostService(child);
Expand Down Expand Up @@ -1060,7 +1060,7 @@ void ExternalCommandProcessor::ScheduleAndPropagateTriggeredHostDowntime(double,
Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5]));

/* Schedule downtime for all child hosts and explicitely trigger them through the parent host's downtime */
BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) {
for (const Checkable::Ptr& child : host->GetAllChildren()) {
Host::Ptr host;
Service::Ptr service;
tie(host, service) = GetHostService(child);
Expand Down

0 comments on commit ea1f872

Please sign in to comment.