blob: c5d1db022303c993143b1521481252e44142952c [file] [log] [blame]
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03001import os
2import uuid
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03003import functools
4
5import yaml
6
7try:
8 from petname import Generate as pet_generate
9except ImportError:
10 def pet_generate(x, y):
11 return str(uuid.uuid4())
12
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030013from . import pretty_yaml
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030014
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030015
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030016class NoData:
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030017 @classmethod
18 def get(cls, name, x):
19 return cls
20
21
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030022class Config:
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030023 def __init__(self, val=None):
24 if val is not None:
25 self.update(val)
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030026 self.results_dir = None
27 self.run_uuid = None
28 self.settings = {}
29 self.run_params_file = None
30 self.default_test_local_folder = None
31 self.hwinfo_directory = None
32 self.hwreport_fname = None
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030033
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030034 def get(self, name, defval=None):
35 obj = self.__dict__
36 for cname in name.split("."):
37 obj = obj.get(cname, NoData)
38
39 if obj is NoData:
40 return defval
41 return obj
42
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030043 def update(self, val):
44 self.__dict__.update(val)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030045
46
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030047def get_test_files(results_dir):
48 in_var_dir = functools.partial(os.path.join, results_dir)
49
50 res = dict(
51 run_params_file='run_params.yaml',
52 saved_config_file='config.yaml',
53 vm_ids_fname='os_vm_ids',
54 html_report_file='{0}_report.html',
koder aka kdanilov88407ff2015-05-26 15:35:57 +030055 load_report_file='load_report.html',
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030056 text_report_file='report.txt',
57 log_file='log.txt',
58 sensor_storage='sensor_storage',
59 nodes_report_file='nodes.yaml',
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030060 results_storage='results',
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030061 hwinfo_directory='hwinfo',
62 hwreport_fname='hwinfo.txt',
63 raw_results='raw_results.yaml')
64
65 res = dict((k, in_var_dir(v)) for k, v in res.items())
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030066 res['results_dir'] = results_dir
koder aka kdanilovfd2cfa52015-05-20 03:17:42 +030067 return res
68
69
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030070def load_config(file_name):
71 file_name = os.path.abspath(file_name)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030072
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030073 defaults = dict(
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030074 testnode_log_root='/tmp/wally',
75 settings={}
76 )
koder aka kdanilov88407ff2015-05-26 15:35:57 +030077
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +030078 raw_cfg = yaml.load(open(file_name).read())
79 raw_cfg['config_folder'] = os.path.dirname(file_name)
80 if 'include' in raw_cfg:
81 default_path = os.path.join(raw_cfg['config_folder'],
82 raw_cfg.pop('include'))
83 default_cfg = yaml.load(open(default_path).read())
84
85 # TODO: Need more intelectual configs merge?
86 default_cfg.update(raw_cfg)
87 raw_cfg = default_cfg
88
89 cfg = Config(defaults)
90 cfg.update(raw_cfg)
91
92 results_storage = cfg.settings.get('results_storage', '/tmp')
93 results_storage = os.path.abspath(results_storage)
94
95 existing = file_name.startswith(results_storage)
96
97 if existing:
98 cfg.results_dir = os.path.dirname(file_name)
99 cfg.run_uuid = os.path.basename(cfg.results_dir)
100 else:
101 # genarate result folder name
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300102 for i in range(10):
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300103 cfg.run_uuid = pet_generate(2, "_")
104 cfg.results_dir = os.path.join(results_storage,
105 cfg.run_uuid)
106 if not os.path.exists(cfg.results_dir):
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300107 break
108 else:
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300109 cfg.run_uuid = str(uuid.uuid4())
110 cfg.results_dir = os.path.join(results_storage,
111 cfg.run_uuid)
koder aka kdanilov88407ff2015-05-26 15:35:57 +0300112
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300113 # setup all files paths
114 cfg.update(get_test_files(cfg.results_dir))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300115
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300116 if existing:
117 cfg.update(load_run_params(cfg.run_params_file))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300118
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300119 testnode_log_root = cfg.get('testnode_log_root')
koder aka kdanilovafd98742015-04-24 01:27:22 +0300120 testnode_log_dir = os.path.join(testnode_log_root, "{0}/{{name}}")
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300121 cfg.default_test_local_folder = testnode_log_dir.format(cfg.run_uuid)
koder aka kdanilov2066daf2015-04-23 21:05:41 +0300122
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300123 return cfg
koder aka kdanilov88407ff2015-05-26 15:35:57 +0300124
125
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300126def save_run_params(cfg):
koder aka kdanilov88407ff2015-05-26 15:35:57 +0300127 params = {
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300128 'comment': cfg.comment,
129 'run_uuid': cfg.run_uuid
koder aka kdanilov88407ff2015-05-26 15:35:57 +0300130 }
koder aka kdanilov0fdaaee2015-06-30 11:10:48 +0300131
132 with open(cfg.run_params_file, 'w') as fd:
koder aka kdanilov88407ff2015-05-26 15:35:57 +0300133 fd.write(pretty_yaml.dumps(params))
134
135
136def load_run_params(run_params_file):
137 with open(run_params_file) as fd:
138 dt = yaml.load(fd)
139
140 return dict(run_uuid=dt['run_uuid'],
141 comment=dt.get('comment'))