Port all changes from github

Change-Id: Ie78388290ad2780074327c26508cdce73805f0da
diff --git a/cvp_checks/utils/__init__.py b/cvp_checks/utils/__init__.py
index 840b4ea..74af967 100644
--- a/cvp_checks/utils/__init__.py
+++ b/cvp_checks/utils/__init__.py
@@ -2,11 +2,14 @@
 import yaml
 import requests
 import re
+import sys, traceback
 
 
 class salt_remote:
     def cmd(self, tgt, fun, param=None, expr_form=None, tgt_type=None):
         config = get_configuration()
+        url = config['SALT_URL']
+        proxies = {"http": None, "https": None}
         headers = {'Accept': 'application/json'}
         login_payload = {'username': config['SALT_USERNAME'],
                          'password': config['SALT_PASSWORD'], 'eauth': 'pam'}
@@ -16,16 +19,23 @@
         if param:
             accept_key_payload['arg'] = param
 
-        login_request = requests.post(os.path.join(config['SALT_URL'],
-                                                   'login'),
-                                      headers=headers, data=login_payload)
-        if login_request.ok:
-            request = requests.post(config['SALT_URL'], headers=headers,
-                                    data=accept_key_payload,
-                                    cookies=login_request.cookies)
-            return request.json()['return'][0]
-        else:
-            raise EnvironmentError("401 Not authorized.")
+        try:
+            login_request = requests.post(os.path.join(url, 'login'),
+                                          headers=headers, data=login_payload,
+                                          proxies=proxies)
+            if login_request.ok:
+                request = requests.post(url, headers=headers,
+                                        data=accept_key_payload,
+                                        cookies=login_request.cookies,
+                                        proxies=proxies)
+                return request.json()['return'][0]
+        except Exception:
+            print "\033[91m\nConnection to SaltMaster " \
+                  "was not established.\n" \
+                  "Please make sure that you " \
+                  "provided correct credentials.\033[0m\n"
+            traceback.print_exc(file=sys.stdout)
+            sys.exit()
 
 
 def init_salt_client():
@@ -76,12 +86,13 @@
     node_groups = {}
     nodes_names = set ()
     expr_form = ''
-    if 'groups' in config.keys():
+    all_nodes = set(local_salt_client.cmd('*', 'test.ping'))
+    if 'groups' in config.keys() and 'PB_GROUPS' in os.environ.keys() and \
+       os.environ['PB_GROUPS'].lower() != 'false':
         nodes_names.update(config['groups'].keys())
-        expr_form = 'pillar'
+        expr_form = 'compound'
     else:
-        nodes = local_salt_client.cmd('*', 'test.ping')
-        for node in nodes:
+        for node in all_nodes:
             index = re.search('[0-9]{1,3}$', node.split('.')[0])
             if index:
                 nodes_names.add(node.split('.')[0][:-len(index.group(0))])
@@ -89,19 +100,42 @@
                 nodes_names.add(node)
         expr_form = 'pcre'
 
+    gluster_nodes = local_salt_client.cmd('I@salt:control and '
+                                          'I@glusterfs:server',
+                                          'test.ping', expr_form='compound')
+    kvm_nodes = local_salt_client.cmd('I@salt:control and not '
+                                      'I@glusterfs:server',
+                                      'test.ping', expr_form='compound')
+
     for node_name in nodes_names:
         skipped_groups = config.get('skipped_groups') or []
         if node_name in skipped_groups:
             continue
         if expr_form == 'pcre':
-            nodes = local_salt_client.cmd(node_name,
+            nodes = local_salt_client.cmd('{}[0-9]{{1,3}}'.format(node_name),
                                           'test.ping',
                                           expr_form=expr_form)
         else:
             nodes = local_salt_client.cmd(config['groups'][node_name],
                                           'test.ping',
                                           expr_form=expr_form)
-        node_groups[node_name]=[x for x in nodes if x not in config['skipped_nodes']]
+            if nodes == {}:
+                continue
+
+        node_groups[node_name]=[x for x in nodes
+                                if x not in config['skipped_nodes']
+                                if x not in gluster_nodes.keys()
+                                if x not in kvm_nodes.keys()]
+        all_nodes = set(all_nodes - set(node_groups[node_name]))
+        if node_groups[node_name] == []:
+            del node_groups[node_name]
+            if kvm_nodes:
+                node_groups['kvm'] = kvm_nodes.keys()
+            node_groups['kvm_gluster'] = gluster_nodes.keys()
+    all_nodes = set(all_nodes - set(kvm_nodes.keys()))
+    all_nodes = set(all_nodes - set(gluster_nodes.keys()))
+    if all_nodes:
+        print ("These nodes were not collected {0}. Check config (groups section)".format(all_nodes))
     return node_groups