blob: 2a09d4789fb828f31d40bc1a221032f18e4f7426 [file] [log] [blame]
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03001import os
2import uuid
3import logging
4import functools
5
6import yaml
7
8try:
9 from petname import Generate as pet_generate
10except ImportError:
11 def pet_generate(x, y):
12 return str(uuid.uuid4())
13
koder aka kdanilov57ce4db2015-04-25 21:25:51 +030014from pretty_yaml import dumps
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030015
16cfg_dict = {}
17
18
19def mkdirs_if_unxists(path):
20 if not os.path.exists(path):
21 os.makedirs(path)
22
23
24def load_config(file_name, explicit_folder=None):
25 first_load = len(cfg_dict) == 0
26 cfg_dict.update(yaml.load(open(file_name).read()))
27
28 if first_load:
29 var_dir = cfg_dict.get('internal', {}).get('var_dir_root', '/tmp')
30
31 run_uuid = None
32 if explicit_folder is None:
33 for i in range(10):
34 run_uuid = pet_generate(2, "_")
35 results_dir = os.path.join(var_dir, run_uuid)
36 if not os.path.exists(results_dir):
37 break
38 else:
39 run_uuid = str(uuid.uuid4())
40 results_dir = os.path.join(var_dir, run_uuid)
koder aka kdanilov4a510ee2015-04-21 18:50:42 +030041 cfg_dict['run_uuid'] = run_uuid.replace('_', '-')
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030042 else:
43 results_dir = explicit_folder
44
45 cfg_dict['var_dir'] = results_dir
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030046 mkdirs_if_unxists(cfg_dict['var_dir'])
47
48 in_var_dir = functools.partial(os.path.join, cfg_dict['var_dir'])
koder aka kdanilov57ce4db2015-04-25 21:25:51 +030049 run_params_file = in_var_dir('run_params.yaml')
50
51 if explicit_folder is not None:
52 with open(run_params_file) as fd:
53 cfg_dict['run_uuid'] = yaml.load(fd)['run_uuid']
54 run_uuid = cfg_dict['run_uuid']
55 else:
56 with open(run_params_file, 'w') as fd:
57 fd.write(dumps({'run_uuid': cfg_dict['run_uuid']}))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030058
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030059 cfg_dict['vm_ids_fname'] = in_var_dir('os_vm_ids')
koder aka kdanilov57ce4db2015-04-25 21:25:51 +030060 cfg_dict['html_report_file'] = in_var_dir('{0}_report.html')
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030061 cfg_dict['text_report_file'] = in_var_dir('report.txt')
62 cfg_dict['log_file'] = in_var_dir('log.txt')
koder aka kdanilov4af1c1d2015-05-18 15:48:58 +030063 cfg_dict['sensor_storage'] = in_var_dir('sensor_storage')
64 mkdirs_if_unxists(cfg_dict['sensor_storage'])
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030065 cfg_dict['nodes_report_file'] = in_var_dir('nodes.yaml')
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030066
koder aka kdanilov4af1c1d2015-05-18 15:48:58 +030067 if 'sensors_remote_path' not in cfg_dict:
68 cfg_dict['sensors_remote_path'] = '/tmp/sensors'
69
koder aka kdanilovafd98742015-04-24 01:27:22 +030070 testnode_log_root = cfg_dict.get('testnode_log_root', '/var/wally')
71 testnode_log_dir = os.path.join(testnode_log_root, "{0}/{{name}}")
koder aka kdanilov2066daf2015-04-23 21:05:41 +030072 cfg_dict['default_test_local_folder'] = \
koder aka kdanilovafd98742015-04-24 01:27:22 +030073 testnode_log_dir.format(cfg_dict['run_uuid'])
koder aka kdanilov2066daf2015-04-23 21:05:41 +030074
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030075 cfg_dict['test_log_directory'] = in_var_dir('test_logs')
76 mkdirs_if_unxists(cfg_dict['test_log_directory'])
77
koder aka kdanilovf86d7af2015-05-06 04:01:54 +030078 cfg_dict['hwinfo_directory'] = in_var_dir('hwinfo')
79 cfg_dict['hwreport_fname'] = in_var_dir('hwinfo.txt')
80 mkdirs_if_unxists(cfg_dict['hwinfo_directory'])
81
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030082
83def color_me(color):
84 RESET_SEQ = "\033[0m"
85 COLOR_SEQ = "\033[1;%dm"
86
87 color_seq = COLOR_SEQ % (30 + color)
88
89 def closure(msg):
90 return color_seq + msg + RESET_SEQ
91 return closure
92
93
94class ColoredFormatter(logging.Formatter):
95 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
96
97 colors = {
98 'WARNING': color_me(YELLOW),
99 'DEBUG': color_me(BLUE),
100 'CRITICAL': color_me(YELLOW),
101 'ERROR': color_me(RED)
102 }
103
104 def __init__(self, msg, use_color=True, datefmt=None):
105 logging.Formatter.__init__(self, msg, datefmt=datefmt)
106 self.use_color = use_color
107
108 def format(self, record):
109 orig = record.__dict__
110 record.__dict__ = record.__dict__.copy()
111 levelname = record.levelname
112
113 prn_name = levelname + ' ' * (8 - len(levelname))
114 if levelname in self.colors:
115 record.levelname = self.colors[levelname](prn_name)
116 else:
117 record.levelname = prn_name
118
koder aka kdanilov6b1341a2015-04-21 22:44:21 +0300119 # super doesn't work here in 2.6 O_o
120 res = logging.Formatter.format(self, record)
121
122 # res = super(ColoredFormatter, self).format(record)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300123
124 # restore record, as it will be used by other formatters
125 record.__dict__ = orig
126 return res
127
128
129def setup_loggers(def_level=logging.DEBUG, log_fname=None):
130 logger = logging.getLogger('wally')
131 logger.setLevel(logging.DEBUG)
132 sh = logging.StreamHandler()
133 sh.setLevel(def_level)
134
koder aka kdanilov168f6092015-04-19 02:33:38 +0300135 log_format = '%(asctime)s - %(levelname)s - %(name)-15s - %(message)s'
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300136 colored_formatter = ColoredFormatter(log_format, datefmt="%H:%M:%S")
137
138 sh.setFormatter(colored_formatter)
139 logger.addHandler(sh)
140
141 logger_api = logging.getLogger("wally.fuel_api")
142
143 if log_fname is not None:
144 fh = logging.FileHandler(log_fname)
koder aka kdanilov168f6092015-04-19 02:33:38 +0300145 log_format = '%(asctime)s - %(levelname)8s - %(name)-15s - %(message)s'
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300146 formatter = logging.Formatter(log_format, datefmt="%H:%M:%S")
147 fh.setFormatter(formatter)
148 fh.setLevel(logging.DEBUG)
149 logger.addHandler(fh)
150 logger_api.addHandler(fh)
koder aka kdanilovec1b9732015-04-23 20:43:29 +0300151 else:
152 fh = None
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300153
154 logger_api.addHandler(sh)
155 logger_api.setLevel(logging.WARNING)
koder aka kdanilovec1b9732015-04-23 20:43:29 +0300156
157 logger = logging.getLogger('paramiko')
158 logger.setLevel(logging.WARNING)
koder aka kdanilovafd98742015-04-24 01:27:22 +0300159 # logger.addHandler(sh)
koder aka kdanilovec1b9732015-04-23 20:43:29 +0300160 if fh is not None:
161 logger.addHandler(fh)