blob: 810894eb1dffc875ebb1f984062db9dc4ed60f74 [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
8class salt_remote:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +00009 def cmd(self, tgt, fun, param=None, expr_form=None, tgt_type=None):
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000010 config = get_configuration()
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050011 url = config['SALT_URL']
12 proxies = {"http": None, "https": None}
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000013 headers = {'Accept': 'application/json'}
14 login_payload = {'username': config['SALT_USERNAME'],
15 'password': config['SALT_PASSWORD'], 'eauth': 'pam'}
16 accept_key_payload = {'fun': fun, 'tgt': tgt, 'client': 'local',
Oleksii Zhurba7a671112018-01-12 11:50:56 -060017 'expr_form': expr_form, 'tgt_type': tgt_type,
18 'timeout': config['salt_timeout']}
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000019 if param:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000020 accept_key_payload['arg'] = param
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000021
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050022 try:
23 login_request = requests.post(os.path.join(url, 'login'),
24 headers=headers, data=login_payload,
25 proxies=proxies)
26 if login_request.ok:
27 request = requests.post(url, headers=headers,
28 data=accept_key_payload,
29 cookies=login_request.cookies,
30 proxies=proxies)
31 return request.json()['return'][0]
32 except Exception:
33 print "\033[91m\nConnection to SaltMaster " \
34 "was not established.\n" \
35 "Please make sure that you " \
36 "provided correct credentials.\033[0m\n"
37 traceback.print_exc(file=sys.stdout)
38 sys.exit()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000039
40
41def init_salt_client():
42 local = salt_remote()
43 return local
44
45
Mikhail Chernik714596e2018-08-10 21:19:07 +020046def list_to_target_string(node_list, separator, add_spaces=True):
47 if add_spaces:
48 separator = ' ' + separator.strip() + ' '
49 return separator.join(node_list)
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000050
51
Oleksii Zhurba020fab42017-11-01 20:13:28 +000052def get_monitoring_ip(param_name):
53 local_salt_client = init_salt_client()
54 salt_output = local_salt_client.cmd(
55 'docker:client:stack:monitoring',
56 'pillar.get',
57 ['_param:{}'.format(param_name)],
58 expr_form='pillar')
59 return salt_output[salt_output.keys()[0]]
60
61
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000062def get_active_nodes(test=None):
63 config = get_configuration()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000064 local_salt_client = init_salt_client()
65
66 skipped_nodes = config.get('skipped_nodes') or []
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000067 if test:
68 testname = test.split('.')[0]
69 if 'skipped_nodes' in config.get(testname).keys():
70 skipped_nodes += config.get(testname)['skipped_nodes'] or []
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000071 if skipped_nodes != ['']:
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000072 print "\nNotice: {0} nodes will be skipped".format(skipped_nodes)
73 nodes = local_salt_client.cmd(
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000074 '* and not ' + list_to_target_string(skipped_nodes, 'and not'),
75 'test.ping',
76 expr_form='compound')
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000077 else:
78 nodes = local_salt_client.cmd('*', 'test.ping')
79 return nodes
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000080
81
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000082def calculate_groups():
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000083 config = get_configuration()
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000084 local_salt_client = init_salt_client()
Oleksii Zhurba30122e12018-03-29 14:01:50 -050085 node_groups = {}
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000086 nodes_names = set ()
87 expr_form = ''
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050088 all_nodes = set(local_salt_client.cmd('*', 'test.ping'))
89 if 'groups' in config.keys() and 'PB_GROUPS' in os.environ.keys() and \
90 os.environ['PB_GROUPS'].lower() != 'false':
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000091 nodes_names.update(config['groups'].keys())
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050092 expr_form = 'compound'
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000093 else:
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050094 for node in all_nodes:
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000095 index = re.search('[0-9]{1,3}$', node.split('.')[0])
96 if index:
97 nodes_names.add(node.split('.')[0][:-len(index.group(0))])
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000098 else:
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +000099 nodes_names.add(node)
100 expr_form = 'pcre'
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000101
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500102 gluster_nodes = local_salt_client.cmd('I@salt:control and '
103 'I@glusterfs:server',
104 'test.ping', expr_form='compound')
105 kvm_nodes = local_salt_client.cmd('I@salt:control and not '
106 'I@glusterfs:server',
107 'test.ping', expr_form='compound')
108
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000109 for node_name in nodes_names:
110 skipped_groups = config.get('skipped_groups') or []
111 if node_name in skipped_groups:
112 continue
113 if expr_form == 'pcre':
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500114 nodes = local_salt_client.cmd('{}[0-9]{{1,3}}'.format(node_name),
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000115 'test.ping',
116 expr_form=expr_form)
117 else:
118 nodes = local_salt_client.cmd(config['groups'][node_name],
119 'test.ping',
120 expr_form=expr_form)
Oleksii Zhurbae592ed12018-06-21 18:01:09 -0500121 if nodes == {}:
122 continue
123
124 node_groups[node_name]=[x for x in nodes
125 if x not in config['skipped_nodes']
126 if x not in gluster_nodes.keys()
127 if x not in kvm_nodes.keys()]
128 all_nodes = set(all_nodes - set(node_groups[node_name]))
129 if node_groups[node_name] == []:
130 del node_groups[node_name]
131 if kvm_nodes:
132 node_groups['kvm'] = kvm_nodes.keys()
133 node_groups['kvm_gluster'] = gluster_nodes.keys()
134 all_nodes = set(all_nodes - set(kvm_nodes.keys()))
135 all_nodes = set(all_nodes - set(gluster_nodes.keys()))
136 if all_nodes:
137 print ("These nodes were not collected {0}. Check config (groups section)".format(all_nodes))
Oleksii Zhurbad0ae87f2018-03-26 13:36:25 -0500138 return node_groups
Oleksii Zhurbae0dedb52018-01-16 00:55:25 +0000139
140
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000141def get_configuration():
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000142 """function returns configuration for environment
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000143 and for test if it's specified"""
144 global_config_file = os.path.join(
145 os.path.dirname(os.path.abspath(__file__)), "../global_config.yaml")
146 with open(global_config_file, 'r') as file:
147 global_config = yaml.load(file)
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000148 for param in global_config.keys():
149 if param in os.environ.keys():
150 if ',' in os.environ[param]:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +0000151 global_config[param] = []
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +0000152 for item in os.environ[param].split(','):
153 global_config[param].append(item)
154 else:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +0000155 global_config[param] = os.environ[param]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000156
157 return global_config