auto service (Service::GetByName(checkableName));
if (service) {
- return std::unique_ptr<ParentsTree>(new ParentsLeaf(std::move(service)));
+ return std::unique_ptr<ParentsTree>(new ParentsLeaf(this, std::move(service)));
}
}
auto host (Host::GetByName(checkableName));
if (host) {
- return std::unique_ptr<ParentsTree>(new ParentsLeaf(std::move(host)));
+ return std::unique_ptr<ParentsTree>(new ParentsLeaf(this, std::move(host)));
}
}
BlameBadParents(std::move(hostName) + "!" + std::move(serviceName));
}
- return std::unique_ptr<ParentsTree>(new ParentsLeaf(std::move(service)));
+ return std::unique_ptr<ParentsTree>(new ParentsLeaf(this, std::move(service)));
} else {
- return std::unique_ptr<ParentsTree>(new ParentsLeaf(std::move(host)));
+ return std::unique_ptr<ParentsTree>(new ParentsLeaf(this, std::move(host)));
}
} else {
std::vector<std::unique_ptr<ParentsTree>> subTrees;
m_Child->AddDependency(this);
- Host::Ptr parentHost = Host::GetByName(GetParentHostName());
+ auto parentHostName (GetParentHostName());
+ auto parentServiceName (GetParentServiceName());
+ auto parents (GetParents());
- if (parentHost) {
- if (GetParentServiceName().IsEmpty())
- m_Parent = parentHost;
- else
- m_Parent = parentHost->GetServiceByShortName(GetParentServiceName());
+ if (!((!parentHostName.IsEmpty() || !parentServiceName.IsEmpty()) ^ !parents.IsEmpty())) {
+ BOOST_THROW_EXCEPTION(ScriptError("Dependency '" + GetName() + "' must reference a parent host/service either via parent_host_name and parent_service_name or via parents, but not via both.", GetDebugInfo()));
}
- if (!m_Parent)
- BOOST_THROW_EXCEPTION(ScriptError("Dependency '" + GetName() + "' references a parent host/service which doesn't exist.", GetDebugInfo()));
+ if (parents.IsEmpty()) {
+ Host::Ptr parentHost = Host::GetByName(parentHostName);
- m_Parent->AddReverseDependency(this);
+ if (parentHost) {
+ if (GetParentServiceName().IsEmpty())
+ m_Parent = parentHost;
+ else
+ m_Parent = parentHost->GetServiceByShortName(parentServiceName);
+ }
- auto parents (GetParents());
+ if (!m_Parent)
+ BOOST_THROW_EXCEPTION(ScriptError("Dependency '" + GetName() + "' references a parent host/service which doesn't exist.", GetDebugInfo()));
- if (!parents.IsEmpty()) {
+ m_Parent->AddReverseDependency(this);
+ } else {
SetParentsTree(RequireParents(parents));
}
ObjectImpl<Dependency>::Stop(runtimeRemoved);
GetChild()->RemoveDependency(this);
- GetParent()->RemoveReverseDependency(this);
+
+ auto parent (GetParent());
+
+ if (parent) {
+ parent->RemoveReverseDependency(this);
+ }
+
SetParentsTree(nullptr);
}
bool Dependency::IsAvailable(DependencyType dt) const
{
- Checkable::Ptr parent = GetParent();
+ return m_ParentsTree ? m_ParentsTree->IsAvailable(dt) : IsAvailable(GetParent(), dt);
+}
+bool Dependency::IsAvailable(const Checkable::Ptr& parent, DependencyType dt) const
+{
Host::Ptr parentHost;
Service::Ptr parentService;
tie(parentHost, parentService) = GetHostService(parent);
subTree->GetAllLeavesFlat(out);
}
}
+
+bool Dependency::ParentsLeaf::IsAvailable(DependencyType dt) const
+{
+ return m_Dep->IsAvailable(m_Checkable, dt);
+}
+
+bool Dependency::ParentsAll::IsAvailable(DependencyType dt) const
+{
+ for (auto& subTree : m_SubTrees) {
+ if (!subTree->IsAvailable(dt))
+ return false;
+ }
+
+ return true;
+}
+
+bool Dependency::ParentsAny::IsAvailable(DependencyType dt) const
+{
+ for (auto& subTree : m_SubTrees) {
+ if (subTree->IsAvailable(dt))
+ return true;
+ }
+
+ return false;
+}
TimePeriod::Ptr GetPeriod() const;
bool IsAvailable(DependencyType dt) const;
+ bool IsAvailable(const Checkable::Ptr& parent, DependencyType dt) const;
void ValidateStates(const Lazy<Array::Ptr>& lvalue, const ValidationUtils& utils) override;
virtual ~ParentsTree() = default;
virtual void GetAllLeavesFlat(std::set<Checkable::Ptr>& out) const = 0;
+ virtual bool IsAvailable(DependencyType dt) const = 0;
protected:
ParentsTree() = default;
class ParentsLeaf : public ParentsTree
{
public:
- inline ParentsLeaf(Checkable::Ptr checkable) : m_Checkable(std::move(checkable))
+ inline ParentsLeaf(Dependency *dep, Checkable::Ptr checkable)
+ : m_Dep(dep), m_Checkable(std::move(checkable))
{
}
void GetAllLeavesFlat(std::set<Checkable::Ptr>& out) const override;
+ bool IsAvailable(DependencyType dt) const override;
private:
+ Dependency *m_Dep;
Checkable::Ptr m_Checkable;
};
void GetAllLeavesFlat(std::set<Checkable::Ptr>& out) const override;
- private:
+ protected:
std::vector<std::unique_ptr<ParentsTree>> m_SubTrees;
};
{
public:
using ParentsBranch::ParentsBranch;
+
+ bool IsAvailable(DependencyType dt) const override;
};
class ParentsAny : public ParentsBranch
{
public:
using ParentsBranch::ParentsBranch;
+
+ bool IsAvailable(DependencyType dt) const override;
};
Checkable::Ptr m_Parent;