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'