]> granicus.if.org Git - icinga2/commitdiff
Undelegate services when their config objects are removed.
authorGunnar Beutner <gunnar.beutner@netways.de>
Wed, 4 Jul 2012 14:50:25 +0000 (16:50 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 4 Jul 2012 14:50:25 +0000 (16:50 +0200)
components/delegation/delegationcomponent.cpp
components/delegation/delegationcomponent.h

index 5729d8d009d73f750c100f5f701f87638b78fa94..e0b92d9de439401ad6a66c2947d47dbb62dae3c7 100644 (file)
@@ -30,7 +30,8 @@ string DelegationComponent::GetName(void) const
 void DelegationComponent::Start(void)
 {
        m_AllServices = boost::make_shared<ConfigObject::Set>(ConfigObject::GetAllObjects(), ConfigObject::MakeTypePredicate("service"));
-       m_AllServices->OnObjectCommitted.connect(boost::bind(&DelegationComponent::ObjectCommittedHandler, this, _2));
+       m_AllServices->OnObjectCommitted.connect(boost::bind(&DelegationComponent::ServiceCommittedHandler, this, _2));
+       m_AllServices->OnObjectRemoved.connect(boost::bind(&DelegationComponent::ServiceRemovedHandler, this, _2));
        m_AllServices->Start();
 
        m_DelegationTimer = boost::make_shared<Timer>();
@@ -60,10 +61,8 @@ void DelegationComponent::Stop(void)
                mgr->UnregisterEndpoint(m_Endpoint);
 }
 
-void DelegationComponent::ObjectCommittedHandler(const ConfigObject::Ptr& object)
+void DelegationComponent::ServiceCommittedHandler(Service service)
 {
-       Service service(object);
-
        string checker = service.GetChecker();
 
        if (!checker.empty()) {
@@ -78,6 +77,19 @@ void DelegationComponent::ObjectCommittedHandler(const ConfigObject::Ptr& object
        }
 }
 
+void DelegationComponent::ServiceRemovedHandler(Service service)
+{
+       string checker = service.GetChecker();
+
+       if (!checker.empty()) {
+               /* TODO: figure out a better way to clear individual services */
+               Endpoint::Ptr endpoint = EndpointManager::GetInstance()->GetEndpointByIdentity(checker);
+
+               if (endpoint)
+                       ClearServices(endpoint);
+       }
+}
+
 void DelegationComponent::AssignService(const Endpoint::Ptr& checker, const Service& service)
 {
        RequestMessage request;
index 5ff024f2b1f6f463733960da137c976a9cc7f7e5..57e740ba1b02a6adcabf288c885e6aa371da66ab 100644 (file)
@@ -41,7 +41,8 @@ private:
        void NewEndpointHandler(const Endpoint::Ptr& endpoint);
        void SessionEstablishedHandler(const Endpoint::Ptr& endpoint);
 
-       void ObjectCommittedHandler(const ConfigObject::Ptr& object);
+       void ServiceCommittedHandler(Service service);
+       void ServiceRemovedHandler(Service service);
        void DelegationTimerHandler(void);
 
        vector<Endpoint::Ptr> GetCheckerCandidates(const Service& service) const;