blob: 85f5a61c433bffee76a60ebf17f236997c4d1a85 [file] [log] [blame]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00001import os
2import yaml
3import requests
4import re
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +00005import pytest
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00006
7class salt_remote:
Oleksii Zhurba28dea432017-10-05 16:48:16 -05008 def cmd(self, tgt, fun, param=None,expr_form=None,tgt_type=None):
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +00009 config = get_configuration()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000010 headers = {'Accept':'application/json'}
11 login_payload = {'username':config['SALT_USERNAME'],'password':config['SALT_PASSWORD'],'eauth':'pam'}
Oleksii Zhurba28dea432017-10-05 16:48:16 -050012 accept_key_payload = {'fun': fun,'tgt':tgt,'client':'local','expr_form':expr_form,'tgt_type':tgt_type}
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000013 if param:
14 accept_key_payload['arg']=param
15
16 login_request = requests.post(os.path.join(config['SALT_URL'],'login'),headers=headers,data=login_payload)
17 request = requests.post(config['SALT_URL'],headers=headers,data=accept_key_payload,cookies=login_request.cookies)
18 return request.json()['return'][0]
19
20
21def init_salt_client():
22 local = salt_remote()
23 return local
24
25
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000026def list_to_target_string(node_list, separator):
27 result = ''
28 for node in node_list:
29 result += node + ' ' + separator + ' '
30 return result.strip(' ' + separator + ' ')
31
32
33def get_active_nodes(test=None):
34 config = get_configuration()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000035 local_salt_client = init_salt_client()
36
37 skipped_nodes = config.get('skipped_nodes') or []
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000038 if test:
39 testname = test.split('.')[0]
40 if 'skipped_nodes' in config.get(testname).keys():
41 skipped_nodes += config.get(testname)['skipped_nodes'] or []
42
43 if skipped_nodes:
44 print "\nNotice: {0} nodes will be skipped".format(skipped_nodes)
45 nodes = local_salt_client.cmd(
46 '* and not '+list_to_target_string(skipped_nodes, 'and not'),
47 'test.ping',
48 expr_form='compound')
49 else:
50 nodes = local_salt_client.cmd('*', 'test.ping')
51 return nodes
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000052
53
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000054def get_groups(test):
55 config = get_configuration()
56 testname = test.split('.')[0]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000057 # assume that node name is like <name>.domain
58 # last 1-3 digits of name are index, e.g. 001 in cpu001
59 # name doesn't contain dots
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000060 active_nodes = get_active_nodes()
61
62 skipped_groups = config.get('skipped_groups') or []
63 if config.get(testname):
64 if 'skipped_groups' in config.get(testname).keys():
65 skipped_groups += config.get(testname)['skipped_groups'] or []
66
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000067 groups = []
68
69 for node in active_nodes:
70 index = re.search('[0-9]{1,3}$', node.split('.')[0])
71 if index:
72 group_name = node.split('.')[0][:-len(index.group(0))]
73 else:
74 group_name = node
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000075 if group_name not in groups:
76 if group_name not in skipped_groups:
77 groups.append(group_name)
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000078 else:
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000079 if group_name+" - skipped" not in groups:
80 groups.append(group_name+" - skipped")
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000081
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000082 return groups
83
84
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000085def get_configuration():
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000086 """function returns configuration for environment
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000087 and for test if it's specified"""
88 global_config_file = os.path.join(
89 os.path.dirname(os.path.abspath(__file__)), "../global_config.yaml")
90 with open(global_config_file, 'r') as file:
91 global_config = yaml.load(file)
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000092 for param in global_config.keys():
93 if param in os.environ.keys():
94 if ',' in os.environ[param]:
95 global_config[param]=[]
96 for item in os.environ[param].split(','):
97 global_config[param].append(item)
98 else:
99 global_config[param]=os.environ[param]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000100
101 return global_config