blob: 6ad3a6db72c083baaf63b88c41736f28956fecfd [file] [log] [blame]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00001import os
2import yaml
3import requests
4import re
Oleksii Zhurbae592ed12018-06-21 18:01:09 -05005import sys, traceback
Oleksii Zhurba3dbed242017-10-31 19:58:53 +00006
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00007
Mikhail Chernikc492a682018-08-27 22:41:17 +02008class AuthenticationError(Exception):
9 pass
10
11
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000012class salt_remote:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000013 def cmd(self, tgt, fun, param=None, expr_form=None, tgt_type=None):
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000014 config = get_configuration()
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050015 url = config['SALT_URL']
16 proxies = {"http": None, "https": None}
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000017 headers = {'Accept': 'application/json'}
18 login_payload = {'username': config['SALT_USERNAME'],
19 'password': config['SALT_PASSWORD'], 'eauth': 'pam'}
20 accept_key_payload = {'fun': fun, 'tgt': tgt, 'client': 'local',
Oleksii Zhurba7a671112018-01-12 11:50:56 -060021 'expr_form': expr_form, 'tgt_type': tgt_type,
22 'timeout': config['salt_timeout']}
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000023 if param:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000024 accept_key_payload['arg'] = param
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000025
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050026 try:
27 login_request = requests.post(os.path.join(url, 'login'),
28 headers=headers, data=login_payload,
29 proxies=proxies)
Mikhail Chernikc492a682018-08-27 22:41:17 +020030 if not login_request.ok:
31 raise AuthenticationError("Authentication to SaltMaster failed")
32
33 request = requests.post(url, headers=headers,
34 data=accept_key_payload,
35 cookies=login_request.cookies,
36 proxies=proxies)
37
38 response = request.json()['return'][0]
39 not_responded = [k for k,v in response.iteritems() if v is False]
40 if not_responded:
41 print ("WARNING: Some nodes are unavailable and removed "
42 "from response: {}".format(', '.join(not_responded))
43 )
44 for node in not_responded:
45 del response[node]
46 return response
47
48 except Exception as e:
49 print ("\033[91m\nConnection to SaltMaster "
50 "was not established.\n"
51 "Please make sure that you "
52 "provided correct credentials.\n"
53 "Error message: {}\033[0m\n".format(e.message or e)
54 )
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050055 traceback.print_exc(file=sys.stdout)
56 sys.exit()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000057
58
59def init_salt_client():
60 local = salt_remote()
61 return local
62
63
Mikhail Chernik714596e2018-08-10 21:19:07 +020064def list_to_target_string(node_list, separator, add_spaces=True):
65 if add_spaces:
66 separator = ' ' + separator.strip() + ' '
67 return separator.join(node_list)
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000068
69
Oleksii Zhurba020fab42017-11-01 20:13:28 +000070def get_monitoring_ip(param_name):
71 local_salt_client = init_salt_client()
72 salt_output = local_salt_client.cmd(
73 'docker:client:stack:monitoring',
74 'pillar.get',
75 ['_param:{}'.format(param_name)],
76 expr_form='pillar')
77 return salt_output[salt_output.keys()[0]]
78
79
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000080def get_active_nodes(test=None):
81 config = get_configuration()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000082 local_salt_client = init_salt_client()
83
84 skipped_nodes = config.get('skipped_nodes') or []
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000085 if test:
86 testname = test.split('.')[0]
87 if 'skipped_nodes' in config.get(testname).keys():
88 skipped_nodes += config.get(testname)['skipped_nodes'] or []
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000089 if skipped_nodes != ['']:
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000090 print "\nNotice: {0} nodes will be skipped".format(skipped_nodes)
91 nodes = local_salt_client.cmd(
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000092 '* and not ' + list_to_target_string(skipped_nodes, 'and not'),
93 'test.ping',
94 expr_form='compound')
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000095 else:
96 nodes = local_salt_client.cmd('*', 'test.ping')
97 return nodes
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000098
99
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000100def calculate_groups():
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000101 config = get_configuration()
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000102 local_salt_client = init_salt_client()
Oleksii Zhurba30122e12018-03-29 14:01:50 -0500103 node_groups = {}
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000104 nodes_names = set ()
105 expr_form = ''
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500106 all_nodes = set(local_salt_client.cmd('*', 'test.ping'))
107 if 'groups' in config.keys() and 'PB_GROUPS' in os.environ.keys() and \
108 os.environ['PB_GROUPS'].lower() != 'false':
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000109 nodes_names.update(config['groups'].keys())
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500110 expr_form = 'compound'
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000111 else:
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500112 for node in all_nodes:
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000113 index = re.search('[0-9]{1,3}$', node.split('.')[0])
114 if index:
115 nodes_names.add(node.split('.')[0][:-len(index.group(0))])
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000116 else:
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000117 nodes_names.add(node)
118 expr_form = 'pcre'
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000119
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500120 gluster_nodes = local_salt_client.cmd('I@salt:control and '
121 'I@glusterfs:server',
122 'test.ping', expr_form='compound')
123 kvm_nodes = local_salt_client.cmd('I@salt:control and not '
124 'I@glusterfs:server',
125 'test.ping', expr_form='compound')
126
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000127 for node_name in nodes_names:
128 skipped_groups = config.get('skipped_groups') or []
129 if node_name in skipped_groups:
130 continue
131 if expr_form == 'pcre':
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500132 nodes = local_salt_client.cmd('{}[0-9]{{1,3}}'.format(node_name),
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000133 'test.ping',
134 expr_form=expr_form)
135 else:
136 nodes = local_salt_client.cmd(config['groups'][node_name],
137 'test.ping',
138 expr_form=expr_form)
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500139 if nodes == {}:
140 continue
141
142 node_groups[node_name]=[x for x in nodes
143 if x not in config['skipped_nodes']
144 if x not in gluster_nodes.keys()
145 if x not in kvm_nodes.keys()]
146 all_nodes = set(all_nodes - set(node_groups[node_name]))
147 if node_groups[node_name] == []:
148 del node_groups[node_name]
149 if kvm_nodes:
150 node_groups['kvm'] = kvm_nodes.keys()
151 node_groups['kvm_gluster'] = gluster_nodes.keys()
152 all_nodes = set(all_nodes - set(kvm_nodes.keys()))
153 all_nodes = set(all_nodes - set(gluster_nodes.keys()))
154 if all_nodes:
155 print ("These nodes were not collected {0}. Check config (groups section)".format(all_nodes))
Oleksii Zhurbad0ae87f2018-03-26 13:36:25 -0500156 return node_groups
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000157
158
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000159def get_configuration():
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000160 """function returns configuration for environment
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000161 and for test if it's specified"""
162 global_config_file = os.path.join(
163 os.path.dirname(os.path.abspath(__file__)), "../global_config.yaml")
164 with open(global_config_file, 'r') as file:
165 global_config = yaml.load(file)
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000166 for param in global_config.keys():
167 if param in os.environ.keys():
168 if ',' in os.environ[param]:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +0000169 global_config[param] = []
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000170 for item in os.environ[param].split(','):
171 global_config[param].append(item)
172 else:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +0000173 global_config[param] = os.environ[param]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000174
175 return global_config