Automatic nodes listing from API
diff --git a/cfg_checker/cfg_check.py b/cfg_checker/cfg_check.py
index b46ca60..d38defa 100644
--- a/cfg_checker/cfg_check.py
+++ b/cfg_checker/cfg_check.py
@@ -11,7 +11,6 @@
from cfg_checker.common.exception import CheckerException, ConfigException
from cfg_checker.common import utils, const
from cfg_checker.common import config, logger, logger_cli, pkg_dir
-from cfg_checker.clients import salt
import cfg_checker.reclass_cmp as reclass_cmp
from cfg_checker.pkg_check import CloudPackageChecker
diff --git a/cfg_checker/common/salt_utils.py b/cfg_checker/common/salt_utils.py
index 1a9d1da..4aba178 100644
--- a/cfg_checker/common/salt_utils.py
+++ b/cfg_checker/common/salt_utils.py
@@ -283,13 +283,15 @@
def list_minions(self):
"""
Fails in salt version 2016.3.8
+ Works starting from 2017.7.7
api returns dict of minions with grains
"""
- return self.salt_request('get', 'minions')
+ return self.salt_request('get', 'minions')[0]
def list_keys(self):
"""
Fails in salt version 2016.3.8
+ Works starting from 2017.7.7
api should return dict:
{
'local': [],
@@ -303,6 +305,7 @@
def get_status(self):
"""
+ Fails in salt version 2017.7.7
'runner' client is the equivalent of 'salt-run'
Returns the
"""
@@ -312,6 +315,10 @@
)
def get_active_nodes(self):
+ """Used when other minion list metods fail
+
+ :return: json result from salt test.ping
+ """
if config.skip_nodes:
logger.info("Nodes to be skipped: {0}".format(config.skip_nodes))
return self.cmd(
diff --git a/cfg_checker/common/settings.py b/cfg_checker/common/settings.py
index 1ee36b4..39aeff2 100644
--- a/cfg_checker/common/settings.py
+++ b/cfg_checker/common/settings.py
@@ -13,6 +13,12 @@
class CheckerConfiguration(object):
+ def load_nodes_list():
+ return utils.get_nodes_list(
+ os.environ.get('CFG_ALL_NODES', None),
+ os.environ.get('SALT_NODE_LIST_FILE', None)
+ )
+
def _init_values(self):
"""Load values from environment variables or put default ones
"""
@@ -39,10 +45,7 @@
'SALT_SCRIPTS_FOLDER',
'cfg_checker_scripts'
)
- self.all_nodes = utils.get_nodes_list(
- os.environ.get('CFG_ALL_NODES', None),
- os.environ.get('SALT_NODE_LIST_FILE', None)
- )
+
self.skip_nodes = utils.node_string_to_list(os.environ.get(
'CFG_SKIP_NODES',
None
diff --git a/cfg_checker/nodes.py b/cfg_checker/nodes.py
index aa14dac..d269393 100644
--- a/cfg_checker/nodes.py
+++ b/cfg_checker/nodes.py
@@ -25,20 +25,39 @@
# Keys for all nodes
# this is not working in scope of 2016.8.3, will overide with list
- # cls.node_keys = cls.salt.list_keys()
+ logger_cli.info("# Collecting node names existing in the cloud")
+ try:
+ _keys = self.salt.list_keys()
+ _str = []
+ for _k, _v in _keys.iteritems():
+ _str.append("{}: {}".format(_k, len(_v)))
+ logger_cli.info("-> keys collected: {}".format(", ".join(_str)))
- logger_cli.info("### Collecting node names existing in the cloud")
- self.node_keys = {
- 'minions': config.all_nodes
- }
+ self.node_keys = {
+ 'minions': _keys['minions']
+ }
+ except Exception as e:
+ _keys = None
+ self.node_keys = None
+
+ # List of minions with grains
+ _minions = self.salt.list_minions()
+ if _minions:
+ logger_cli.info("-> api reported {} active minions".format(len(_minions)))
+ elif not self.node_keys:
+ # this is the last resort
+ _minions = config.load_nodes_list()
+ logger_cli.info("-> {} nodes loaded from list file".format(len(_minions)))
+ else:
+ _minions = self.node_keys['minions']
- # all that answer ping
+ # in case API not listed minions, we need all that answer ping
_active = self.salt.get_active_nodes()
- logger_cli.debug("-> Nodes responded: {}".format(_active))
+ logger_cli.info("-> nodes responded: {}".format(len(_active)))
# just inventory for faster interaction
# iterate through all accepted nodes and create a dict for it
self.nodes = {}
- for _name in self.node_keys['minions']:
+ for _name in _minions:
_nc = utils.get_node_code(_name)
_rmap = const.all_roles_map
_role = _rmap[_nc] if _nc in _rmap else 'unknown'