blob: 8eafecc4cf5abc56f25f33e8f5739b5e5f142ad3 [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
14
15cfg_dict = {}
16
17
18def mkdirs_if_unxists(path):
19 if not os.path.exists(path):
20 os.makedirs(path)
21
22
23def load_config(file_name, explicit_folder=None):
24 first_load = len(cfg_dict) == 0
25 cfg_dict.update(yaml.load(open(file_name).read()))
26
27 if first_load:
28 var_dir = cfg_dict.get('internal', {}).get('var_dir_root', '/tmp')
29
30 run_uuid = None
31 if explicit_folder is None:
32 for i in range(10):
33 run_uuid = pet_generate(2, "_")
34 results_dir = os.path.join(var_dir, run_uuid)
35 if not os.path.exists(results_dir):
36 break
37 else:
38 run_uuid = str(uuid.uuid4())
39 results_dir = os.path.join(var_dir, run_uuid)
koder aka kdanilov4a510ee2015-04-21 18:50:42 +030040 cfg_dict['run_uuid'] = run_uuid.replace('_', '-')
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030041 else:
42 results_dir = explicit_folder
43
44 cfg_dict['var_dir'] = results_dir
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030045 mkdirs_if_unxists(cfg_dict['var_dir'])
46
47 in_var_dir = functools.partial(os.path.join, cfg_dict['var_dir'])
48
49 cfg_dict['charts_img_path'] = in_var_dir('charts')
50 mkdirs_if_unxists(cfg_dict['charts_img_path'])
51
52 cfg_dict['vm_ids_fname'] = in_var_dir('os_vm_ids')
53 cfg_dict['html_report_file'] = in_var_dir('report.html')
54 cfg_dict['text_report_file'] = in_var_dir('report.txt')
55 cfg_dict['log_file'] = in_var_dir('log.txt')
56 cfg_dict['sensor_storage'] = in_var_dir('sensor_storage.txt')
57
koder aka kdanilov2066daf2015-04-23 21:05:41 +030058 cfg_dict['default_test_local_folder'] = \
59 "/var/wally/{0}/{{name}}".format(cfg_dict['run_uuid'])
60
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030061 cfg_dict['test_log_directory'] = in_var_dir('test_logs')
62 mkdirs_if_unxists(cfg_dict['test_log_directory'])
63
64
65def color_me(color):
66 RESET_SEQ = "\033[0m"
67 COLOR_SEQ = "\033[1;%dm"
68
69 color_seq = COLOR_SEQ % (30 + color)
70
71 def closure(msg):
72 return color_seq + msg + RESET_SEQ
73 return closure
74
75
76class ColoredFormatter(logging.Formatter):
77 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
78
79 colors = {
80 'WARNING': color_me(YELLOW),
81 'DEBUG': color_me(BLUE),
82 'CRITICAL': color_me(YELLOW),
83 'ERROR': color_me(RED)
84 }
85
86 def __init__(self, msg, use_color=True, datefmt=None):
87 logging.Formatter.__init__(self, msg, datefmt=datefmt)
88 self.use_color = use_color
89
90 def format(self, record):
91 orig = record.__dict__
92 record.__dict__ = record.__dict__.copy()
93 levelname = record.levelname
94
95 prn_name = levelname + ' ' * (8 - len(levelname))
96 if levelname in self.colors:
97 record.levelname = self.colors[levelname](prn_name)
98 else:
99 record.levelname = prn_name
100
koder aka kdanilov6b1341a2015-04-21 22:44:21 +0300101 # super doesn't work here in 2.6 O_o
102 res = logging.Formatter.format(self, record)
103
104 # res = super(ColoredFormatter, self).format(record)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300105
106 # restore record, as it will be used by other formatters
107 record.__dict__ = orig
108 return res
109
110
111def setup_loggers(def_level=logging.DEBUG, log_fname=None):
112 logger = logging.getLogger('wally')
113 logger.setLevel(logging.DEBUG)
114 sh = logging.StreamHandler()
115 sh.setLevel(def_level)
116
koder aka kdanilov168f6092015-04-19 02:33:38 +0300117 log_format = '%(asctime)s - %(levelname)s - %(name)-15s - %(message)s'
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300118 colored_formatter = ColoredFormatter(log_format, datefmt="%H:%M:%S")
119
120 sh.setFormatter(colored_formatter)
121 logger.addHandler(sh)
122
123 logger_api = logging.getLogger("wally.fuel_api")
124
125 if log_fname is not None:
126 fh = logging.FileHandler(log_fname)
koder aka kdanilov168f6092015-04-19 02:33:38 +0300127 log_format = '%(asctime)s - %(levelname)8s - %(name)-15s - %(message)s'
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300128 formatter = logging.Formatter(log_format, datefmt="%H:%M:%S")
129 fh.setFormatter(formatter)
130 fh.setLevel(logging.DEBUG)
131 logger.addHandler(fh)
132 logger_api.addHandler(fh)
koder aka kdanilovec1b9732015-04-23 20:43:29 +0300133 else:
134 fh = None
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300135
136 logger_api.addHandler(sh)
137 logger_api.setLevel(logging.WARNING)
koder aka kdanilovec1b9732015-04-23 20:43:29 +0300138
139 logger = logging.getLogger('paramiko')
140 logger.setLevel(logging.WARNING)
141 logger.addHandler(sh)
142 if fh is not None:
143 logger.addHandler(fh)