]> granicus.if.org Git - icinga2/commitdiff
Re-designed reachability detection.
authorGunnar Beutner <gunnar@beutner.name>
Tue, 3 Jul 2012 13:11:11 +0000 (15:11 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Tue, 3 Jul 2012 13:11:54 +0000 (15:11 +0200)
cib/service.cpp
cib/service.h
components/compat/compatcomponent.cpp
components/delegation/delegationcomponent.cpp

index 0b29e8b6f75784a17e2ad5fde7e3fb5c76238ffa..f15e30de185ea42f48486ec3824590ec68d81e18 100644 (file)
@@ -186,74 +186,17 @@ void Service::InvalidateDependencyCache(void)
        m_DependencyCacheValid = false;
 }
 
-ServiceStatusMessage Service::CalculateCombinedStatus(Service *current, ServiceStatusMessage *input, const vector<Service>& parents)
+bool Service::IsReachable(void) const
 {
-       vector<Service> failedServices;
+       vector<Service> parents = GetParents();
 
-       time_t nextCheck = -1;
-
-       vector<Service>::const_iterator it;
+       vector<Service>::iterator it;
        for (it = parents.begin(); it != parents.end(); it++) {
-               Service parent = *it;
-
-               if (current && current->GetName() == parent.GetName())
-                       continue;
-
-               if (!parent.HasLastCheckResult())
-                       continue;
-
-               string svcname;
-               ServiceState state = StateUnknown;
-               ServiceStateType type = StateTypeHard;
-               if (input && input->GetService(&svcname) && svcname == parent.GetName()) {
-                       input->GetState(&state);
-                       input->GetStateType(&type);
-               } else {
-                       state = parent.GetState();
-                       type = parent.GetStateType();
-               }
-
-               if (state != StateOK && state != StateWarning && type == StateTypeHard)
-                       failedServices.push_back(parent);
-
-               if (nextCheck == -1 || parent.GetNextCheck() < nextCheck)
-                       nextCheck = parent.GetNextCheck();
-       }
-
-       string message;
-       ServiceState state;
-
-       if (failedServices.empty()) {
-               if (input)
-                       return *input;
-
-               state = StateOK;
-               message = "Dependant services are available.";
-       } else {
-               state = StateUnreachable;
-               message = "One or more dependant services have failed.";
+               if (!it->IsReachable())
+                       return false;
        }
-
-       ServiceStatusMessage result;
-       result.SetState(state);
-       result.SetStateType(StateTypeHard);
-       result.SetCurrentCheckAttempt(1);
-       result.SetNextCheck(nextCheck);
-
-       time_t now;
-       time(&now);
-
-       CheckResult cr;
-       cr.SetScheduleStart(now);
-       cr.SetScheduleEnd(now);
-       cr.SetExecutionStart(now);
-       cr.SetExecutionEnd(now);
-       cr.SetOutput(message);
-       cr.SetState(state);
-
-       result.SetCheckResult(cr);
-
-       return result;
+       
+       return true;
 }
 
 void Service::SetNextCheck(time_t nextCheck)
@@ -407,7 +350,6 @@ ServiceState Service::StateFromString(const string& state)
                stateLookup["ok"] = StateOK;
                stateLookup["warning"] = StateWarning;
                stateLookup["critical"] = StateCritical;
-               stateLookup["unreachable"] = StateUnreachable;
                stateLookup["uncheckable"] = StateUncheckable;
                stateLookup["unknown"] = StateUnknown;
        }
@@ -430,8 +372,6 @@ string Service::StateToString(ServiceState state)
                        return "warning";
                case StateCritical:
                        return "critical";
-               case StateUnreachable:
-                       return "unreachable";
                case StateUncheckable:
                        return "uncheckable";
                case StateUnknown:
index 431849ce7aebcece1106f663b97e87d1b5bf1550..67eddb9ff50dfdd1518a5d7610aa55afa53239cb 100644 (file)
@@ -10,7 +10,6 @@ enum ServiceState
        StateWarning,
        StateCritical,
        StateUnknown,
-       StateUnreachable,
        StateUncheckable,
 };
 
@@ -50,7 +49,7 @@ public:
        static void UpdateDependencyCache(void);
        static void InvalidateDependencyCache(void);
 
-       static ServiceStatusMessage CalculateCombinedStatus(Service *current, ServiceStatusMessage *input, const vector<Service>& parents);
+       bool IsReachable(void) const;
 
        void SetNextCheck(time_t nextCheck);
        time_t GetNextCheck(void);
index 17ae39249fb3b107090e0104b253f9767cdb7388..bc670b0ff56c23df1119d3212b3b628e2d6359c0 100644 (file)
@@ -113,8 +113,16 @@ void CompatComponent::DumpServiceStatus(ofstream& fp, Service service)
 
        int state = service.GetState();
 
-       if (state == StateUnreachable)
+       if (!service.IsReachable()) {
                state = StateCritical;
+               
+               string text = "One or more parent services are unavailable.";
+
+               if (output.empty())
+                       output = text;
+               else
+                       output = text + " (" + output + ")";
+       }
 
        if (state >= StateUnknown)
                state = StateUnknown;
index beef490f1293e21412a133e2d4c69178adcc4f94..5729d8d009d73f750c100f5f701f87638b78fa94 100644 (file)
@@ -306,39 +306,10 @@ void DelegationComponent::CheckResultRequestHandler(const Endpoint::Ptr& sender,
        if (!service.IsAllowedChecker(sender->GetIdentity()))
                return;
 
-       vector<Service> children = service.GetChildren();
-
-       vector<Service>::iterator it;
-       for (it = children.begin(); it != children.end(); it++) {
-               Service child = *it;
-
-               vector<Service> affectedServices = child.GetParents();
-               affectedServices.push_back(child);
-
-               ServiceStatusMessage statusmsg = Service::CalculateCombinedStatus(&child, NULL, affectedServices);
-               statusmsg.SetService(child.GetName());
-
-               ServiceState state = StateUnreachable;
-               statusmsg.GetState(&state);
-
-               if (child.GetState() == StateUnreachable || state == StateUnreachable) {
-                       RequestMessage rm;
-                       rm.SetMethod("delegation::ServiceStatus");
-                       rm.SetParams(statusmsg);
-
-                       EndpointManager::GetInstance()->SendMulticastMessage(m_Endpoint, rm);
-               }
-       }
-
        /* send state update */
        RequestMessage rm;
        rm.SetMethod("delegation::ServiceStatus");
-
-       vector<Service> parents = service.GetParents();
-       ServiceStatusMessage statusmsg = Service::CalculateCombinedStatus(&service, &params, parents);
-       statusmsg.SetService(service.GetName());
-
-       rm.SetParams(statusmsg);
+       rm.SetParams(params);
        EndpointManager::GetInstance()->SendMulticastMessage(m_Endpoint, rm);
 }