koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 1 | import os |
| 2 | import uuid |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 3 | import functools |
| 4 | |
| 5 | import yaml |
| 6 | |
| 7 | try: |
| 8 | from petname import Generate as pet_generate |
| 9 | except ImportError: |
| 10 | def pet_generate(x, y): |
| 11 | return str(uuid.uuid4()) |
| 12 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame^] | 13 | from . import pretty_yaml |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 14 | |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 15 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame^] | 16 | class NoData: |
koder aka kdanilov | fd2cfa5 | 2015-05-20 03:17:42 +0300 | [diff] [blame] | 17 | @classmethod |
| 18 | def get(cls, name, x): |
| 19 | return cls |
| 20 | |
| 21 | |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame^] | 22 | class Config: |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 23 | def __init__(self, val=None): |
| 24 | if val is not None: |
| 25 | self.update(val) |
koder aka kdanilov | 3b4da8b | 2016-10-17 00:17:53 +0300 | [diff] [blame^] | 26 | 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 kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 33 | |
koder aka kdanilov | fd2cfa5 | 2015-05-20 03:17:42 +0300 | [diff] [blame] | 34 | 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 kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 43 | def update(self, val): |
| 44 | self.__dict__.update(val) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 45 | |
| 46 | |
koder aka kdanilov | fd2cfa5 | 2015-05-20 03:17:42 +0300 | [diff] [blame] | 47 | def 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 kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 55 | load_report_file='load_report.html', |
koder aka kdanilov | fd2cfa5 | 2015-05-20 03:17:42 +0300 | [diff] [blame] | 56 | text_report_file='report.txt', |
| 57 | log_file='log.txt', |
| 58 | sensor_storage='sensor_storage', |
| 59 | nodes_report_file='nodes.yaml', |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 60 | results_storage='results', |
koder aka kdanilov | fd2cfa5 | 2015-05-20 03:17:42 +0300 | [diff] [blame] | 61 | 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 kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 66 | res['results_dir'] = results_dir |
koder aka kdanilov | fd2cfa5 | 2015-05-20 03:17:42 +0300 | [diff] [blame] | 67 | return res |
| 68 | |
| 69 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 70 | def load_config(file_name): |
| 71 | file_name = os.path.abspath(file_name) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 72 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 73 | defaults = dict( |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 74 | testnode_log_root='/tmp/wally', |
| 75 | settings={} |
| 76 | ) |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 77 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 78 | 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 kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 102 | for i in range(10): |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 103 | 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 kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 107 | break |
| 108 | else: |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 109 | cfg.run_uuid = str(uuid.uuid4()) |
| 110 | cfg.results_dir = os.path.join(results_storage, |
| 111 | cfg.run_uuid) |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 112 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 113 | # setup all files paths |
| 114 | cfg.update(get_test_files(cfg.results_dir)) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 115 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 116 | if existing: |
| 117 | cfg.update(load_run_params(cfg.run_params_file)) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 118 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 119 | testnode_log_root = cfg.get('testnode_log_root') |
koder aka kdanilov | afd9874 | 2015-04-24 01:27:22 +0300 | [diff] [blame] | 120 | testnode_log_dir = os.path.join(testnode_log_root, "{0}/{{name}}") |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 121 | cfg.default_test_local_folder = testnode_log_dir.format(cfg.run_uuid) |
koder aka kdanilov | 2066daf | 2015-04-23 21:05:41 +0300 | [diff] [blame] | 122 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 123 | return cfg |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 124 | |
| 125 | |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 126 | def save_run_params(cfg): |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 127 | params = { |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 128 | 'comment': cfg.comment, |
| 129 | 'run_uuid': cfg.run_uuid |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 130 | } |
koder aka kdanilov | 0fdaaee | 2015-06-30 11:10:48 +0300 | [diff] [blame] | 131 | |
| 132 | with open(cfg.run_params_file, 'w') as fd: |
koder aka kdanilov | 88407ff | 2015-05-26 15:35:57 +0300 | [diff] [blame] | 133 | fd.write(pretty_yaml.dumps(params)) |
| 134 | |
| 135 | |
| 136 | def 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')) |