[PATCH 2/2] add a host_down_list - a flat (and optional) list of hosts which are known to be down this keeps us from bothering to connect to hosts we know are out of commission right now. works with both minion kinds

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 func/commonconfig.py    |    3 +-
 func/overlord/client.py |   62 +++++++++++++++++++++++++++-------------------
 2 files changed, 38 insertions(+), 27 deletions(-)

diff --git a/func/commonconfig.py b/func/commonconfig.py
index f8e2c7f..f35d576 100644
--- a/func/commonconfig.py
+++ b/func/commonconfig.py
@@ -45,4 +45,5 @@ class OverlordConfig(BaseConfig):
     puppet_minions = BoolOption(False)
     puppet_inventory = Option('/var/lib/puppet/ssl/ca/inventory.txt')
     puppet_crl = Option('/var/lib/puppet/ssl/ca/ca_crl.pem')
-
+    host_down_list = Option('/var/lib/func/hosts_down.lst')
+    
diff --git a/func/overlord/client.py b/func/overlord/client.py
index 1b05964..27a92c7 100644
--- a/func/overlord/client.py
+++ b/func/overlord/client.py
@@ -107,6 +107,7 @@ class Minions(object):
         self.exclude_spec = exclude_spec
 
         self.cm_config = read_config(CONFIG_FILE, CMConfig)
+        self.overlord_config = read_config(OVERLORD_CONFIG_FILE, OverlordConfig)        
         self.group_class = groups.Groups(backend=groups_backend,
                                     get_hosts_for_spec=self.get_hosts_for_spec,
                                     **kwargs)
@@ -115,7 +116,8 @@ class Minions(object):
         self.all_hosts = set()
         self.all_certs = set()
         self.all_urls = []
-
+        self._downed_hosts = []
+        
     def _get_new_hosts(self):
         self.new_hosts = self._get_group_hosts(self.spec)
         return self.new_hosts
@@ -210,11 +212,14 @@ class Minions(object):
             self._get_new_hosts()
             self._get_all_hosts()
             hosts = self.all_hosts
-            results = self.all_urls
-        else:
-            results = []
-            
+        
+        results = []
+        
         for host in hosts:
+            if host in self.downed_hosts:
+                sys.stderr.write("%s excluded due to being listed in %s\n" % (host, self.overlord_config.host_down_list))
+                # FIXME maybe we should splat something to the logs?
+                continue
             if not self.just_fqdns:
                 host_res = "https://%s:%s"; % (host, self.port)
             else:
@@ -235,33 +240,38 @@ class Minions(object):
             return True
         return False
 
+    def _get_downed_hosts(self):
+        """returns a list of minions which are known to not be up"""
+        if self._downed_hosts:
+            return self._downed_hosts
+            
+        hosts = []
+        if self.overlord_config.host_down_list and \
+                  os.path.exists(self.overlord_config.host_down_list):
+            fo = open(self.overlord_config.host_down_list, 'r')
+            for line in fo.readlines():
+                if re.match('\s*(#|$)', line):
+                    continue
+                hn = line.replace('\n','')
+                if hn not in hosts:
+                    hosts.append(hn)
+            fo.close()
+        
+        self._downed_hosts = hosts
+        
+        return self._downed_hosts
+    
+    downed_hosts = property(fget=lambda self: self._get_downed_hosts())
 
 class PuppetMinions(Minions):
     def __init__(self, spec, port=51234,
                  noglobs=None, verbose=None,
                  just_fqdns=False, groups_backend="conf",
                  delegate=False, minionmap={},exclude_spec=None,**kwargs):
-        self.spec = spec
-        self.port = port
-        self.noglobs = noglobs
-        self.verbose = verbose
-        self.just_fqdns = just_fqdns
-        self.delegate = delegate
-        self.minionmap = minionmap
-        self.exclude_spec = exclude_spec
-
-        self.cm_config = read_config(CONFIG_FILE, CMConfig)
-        self.overlord_config = read_config(OVERLORD_CONFIG_FILE, OverlordConfig)
-
-        self.group_class = groups.Groups(backend=groups_backend,
-                                   get_hosts_for_spec=self.get_hosts_for_spec,
-                                   **kwargs)
-        #lets make them sets so we dont loop again and again
-        self.all_hosts = set()
-        self.all_certs = set()
-        self.all_urls = []
-
-
+        Minions.__init__(self, spec, port=port, noglobs=noglobs, verbose=verbose,
+                        just_fqdns=just_fqdns, groups_backend=groups_backend,
+                        delegate=delegate, minionmap=minionmap, 
+                        exclude_spec=exclude_spec,**kwargs)
 
     def _get_hosts_for_spec(self,each_gloob):
         """
-- 
1.6.6

_______________________________________________
Func-list mailing list
Func-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/func-list

[Index of Archives]     [Fedora Users]     [Linux Networking]     [Fedora Legacy List]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]

  Powered by Linux