def main(): utils.init_config_and_logging( config.COMMON_OPTS + config.OPENSTACK_OPTS + config.SERVER_OPTS + config.REPORT_OPTS ) output = dict(records=[], agents={}, scenarios={}, tests={}) for scenario_file_name in [cfg.CONF.scenario]: scenario = utils.read_yaml_file(scenario_file_name) scenario['title'] = scenario.get('title') or scenario_file_name scenario['file_name'] = cfg.CONF.scenario play_output = play_scenario(scenario) output['scenarios'][scenario['title']] = play_output['scenario'] output['records'] += play_output['records'] output['agents'].update(play_output['agents']) output['tests'].update(play_output['tests']) if cfg.CONF.output: utils.write_file(json.dumps(output, indent=2), cfg.CONF.output) if cfg.CONF.no_report_on_error and 'error' in output: LOG.info('Skipped report generation due to errors and ' 'no_report_on_error=True') else: report.generate_report(output, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit)
def act(): output = dict(records={}, agents={}, scenarios={}, tests={}) for scenario_param in [cfg.CONF.scenario]: LOG.debug('Processing scenario: %s', scenario_param) alias = '%s%s.yaml' % (config.SCENARIOS, scenario_param) packaged = utils.resolve_relative_path(alias) # use packaged scenario or fallback to full path scenario_file_name = packaged or scenario_param LOG.info('Play scenario: %s', scenario_file_name) scenario = utils.read_yaml_file(scenario_file_name) scenario['title'] = scenario.get('title') or scenario_file_name scenario['file_name'] = scenario_file_name play_output = play_scenario(scenario) output['scenarios'][scenario['title']] = play_output['scenario'] output['records'].update(play_output['records']) output['agents'].update(play_output['agents']) output['tests'].update(play_output['tests']) if cfg.CONF.output: utils.write_file(json.dumps(output, indent=2), cfg.CONF.output) if cfg.CONF.no_report_on_error and 'error' in output: LOG.info('Skipped report generation due to errors and ' 'no_report_on_error=True') else: report.generate_report(output, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit, cfg.CONF.book)
def generate_report(data, report_template, report_filename, subunit_filename): LOG.debug('Generating report, template: %s, output: %s', report_template, report_filename or '<dummy>') data['records'] += calculate_stats(data['records'], data['tests']) sla_records = verify_sla(data['records'], data['tests']) if subunit_filename: save_to_subunit(sla_records, subunit_filename) # add more filters to jinja jinja_env = jinja2.Environment(variable_start_string='[[[', variable_end_string=']]]', comment_start_string='[[#', comment_end_string='#]]') jinja_env.filters['json'] = json.dumps jinja_env.filters['yaml'] = functools.partial(yaml.safe_dump, indent=2, default_flow_style=False) template = utils.read_file(report_template) compiled_template = jinja_env.from_string(template) rendered_template = compiled_template.render(dict(report=data)) if report_filename: LOG.debug('Writing report to: %s', report_filename) try: utils.write_file(rendered_template, report_filename) LOG.info('Report saved to: %s', report_filename) except IOError as e: LOG.error('Failed to write report file: %s', e)
def main(): utils.init_config_and_logging(config.COMMON_OPTS + config.OPENSTACK_OPTS + config.SERVER_OPTS + config.REPORT_OPTS) output = dict(records={}, agents={}, scenarios={}, tests={}) for scenario_param in [cfg.CONF.scenario]: LOG.debug('Processing scenario: %s', scenario_param) alias = '%s%s.yaml' % (config.SCENARIOS, scenario_param) packaged = utils.resolve_relative_path(alias) # use packaged scenario or fallback to full path scenario_file_name = packaged or scenario_param LOG.info('Play scenario: %s', scenario_file_name) scenario = utils.read_yaml_file(scenario_file_name) scenario['title'] = scenario.get('title') or scenario_file_name scenario['file_name'] = scenario_file_name play_output = play_scenario(scenario) output['scenarios'][scenario['title']] = play_output['scenario'] output['records'].update(play_output['records']) output['agents'].update(play_output['agents']) output['tests'].update(play_output['tests']) if cfg.CONF.output: utils.write_file(json.dumps(output, indent=2), cfg.CONF.output) if cfg.CONF.no_report_on_error and 'error' in output: LOG.info('Skipped report generation due to errors and ' 'no_report_on_error=True') else: report.generate_report(output, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit)
def main(): utils.init_config_and_logging(config.COMMON_OPTS + config.OPENSTACK_OPTS + config.SERVER_OPTS + config.REPORT_OPTS) output = dict(records=[], agents={}, scenarios={}, tests={}) for scenario_file_name in [cfg.CONF.scenario]: scenario = utils.read_yaml_file(scenario_file_name) scenario['title'] = scenario.get('title') or scenario_file_name scenario['file_name'] = cfg.CONF.scenario play_output = play_scenario(scenario) output['scenarios'][scenario['title']] = play_output['scenario'] output['records'] += play_output['records'] output['agents'].update(play_output['agents']) output['tests'].update(play_output['tests']) if cfg.CONF.output: utils.write_file(json.dumps(output, indent=2), cfg.CONF.output) if cfg.CONF.no_report_on_error and 'error' in output: LOG.info('Skipped report generation due to errors and ' 'no_report_on_error=True') else: report.generate_report(output, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit)
def act(): output = dict(records={}, agents={}, scenarios={}, tests={}) for scenario_param in [cfg.CONF.scenario]: LOG.debug('Processing scenario: %s', scenario_param) alias_base = scenario_param if alias_base[:11] == 'networking/': # backward compatibility LOG.warning('Scenarios from networking/ are moved to openstack/') alias_base = 'openstack/' + alias_base[11:] alias = '%s%s.yaml' % (config.SCENARIOS, alias_base) packaged = utils.resolve_relative_path(alias) # use packaged scenario or fallback to full path scenario_file_name = packaged or scenario_param LOG.info('Play scenario: %s', scenario_file_name) scenario = utils.read_yaml_file(scenario_file_name) schema = utils.read_yaml_file(utils.resolve_relative_path( '%s%s.yaml' % (config.SCHEMAS, 'scenario'))) utils.validate_yaml(scenario, schema) scenario['title'] = scenario.get('title') or scenario_file_name scenario['file_name'] = scenario_file_name play_output = play_scenario(scenario) output['scenarios'][scenario['title']] = play_output['scenario'] output['records'].update(play_output['records']) output['agents'].update(play_output['agents']) output['tests'].update(play_output['tests']) output_path = "" if cfg.CONF.output: output_path = cfg.CONF.output else: tmp_dir = tempfile.gettempdir() tmp_report = "shaker_%s.json" % str( datetime.datetime.now()).replace(' ', '_') output_path = os.path.join(tmp_dir, tmp_report) utils.write_file(json.dumps(output, indent=2), output_path) if cfg.CONF.no_report_on_error and 'error' in output: LOG.info('Skipped report generation due to errors and ' 'no_report_on_error=True') else: report.generate_report(output, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit, cfg.CONF.book)
def act(): output = dict(records={}, agents={}, scenarios={}, tests={}) for scenario_param in [cfg.CONF.scenario]: LOG.debug('Processing scenario: %s', scenario_param) alias_base = scenario_param if alias_base[:11] == 'networking/': # backward compatibility LOG.warning('Scenarios from networking/ are moved to openstack/') alias_base = 'openstack/' + alias_base[11:] alias = '%s%s.yaml' % (config.SCENARIOS, alias_base) packaged = utils.resolve_relative_path(alias) # use packaged scenario or fallback to full path scenario_file_name = packaged or scenario_param LOG.info('Play scenario: %s', scenario_file_name) scenario = utils.read_yaml_file(scenario_file_name) schema = utils.read_yaml_file( utils.resolve_relative_path('%s%s.yaml' % (config.SCHEMAS, 'scenario'))) utils.validate_yaml(scenario, schema) scenario['title'] = scenario.get('title') or scenario_file_name scenario['file_name'] = scenario_file_name play_output = play_scenario(scenario) output['scenarios'][scenario['title']] = play_output['scenario'] output['records'].update(play_output['records']) output['agents'].update(play_output['agents']) output['tests'].update(play_output['tests']) if cfg.CONF.output: utils.write_file(json.dumps(output, indent=2), cfg.CONF.output) if cfg.CONF.no_report_on_error and 'error' in output: LOG.info('Skipped report generation due to errors and ' 'no_report_on_error=True') else: report.generate_report(output, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit, cfg.CONF.book)
def act(): outputs = [] message_queue = None if 'server_endpoint' in cfg.CONF: message_queue = messaging.MessageQueue(cfg.CONF.server_endpoint) artifacts_dir = cfg.CONF.artifacts_dir if artifacts_dir: utils.mkdir_tree(artifacts_dir) for scenario_name in cfg.CONF.scenario: LOG.info('Play scenario: %s', scenario_name) scenario = read_scenario(scenario_name) play_output = play_scenario(message_queue, scenario) outputs.append(copy.deepcopy(play_output)) # if requested make separate reports if artifacts_dir: prefix = utils.strict(scenario_name) report_name_fn = functools.partial(utils.join_folder_prefix_ext, artifacts_dir, prefix) utils.write_file(json.dumps(play_output, indent=2), report_name_fn('json')) report.generate_report(play_output, cfg.CONF.report_template, report_name_fn('html'), report_name_fn('subunit'), report_name_fn()) LOG.info('Generating aggregated report') aggregated = utils.merge_dicts(outputs) utils.write_file(json.dumps(aggregated, indent=2), cfg.CONF.output) LOG.info('Raw output is stored to: %s', cfg.CONF.output) report.generate_report(aggregated, cfg.CONF.report_template, cfg.CONF.report, cfg.CONF.subunit, cfg.CONF.book)
def generate_report(data, report_template, report_filename, subunit_filename, book_folder): calculate_stats(data['records'], data['tests']) sla_records = verify_sla(data['records'], data['tests']) data['sla'] = output_sla(sla_records) if subunit_filename: save_to_subunit(sla_records, subunit_filename) # add more filters to jinja jinja_env = jinja2.Environment(variable_start_string='[[[', variable_end_string=']]]', comment_start_string='[[#', comment_end_string='#]]') jinja_env.filters['json'] = json.dumps jinja_env.filters['yaml'] = functools.partial(yaml.safe_dump, indent=2, default_flow_style=False) alias_mapper = lambda f: config.REPORT_TEMPLATES + '%s.html' % f template = utils.read_file(report_template, alias_mapper=alias_mapper) compiled_template = jinja_env.from_string(template) rendered_template = compiled_template.render(dict(report=data)) if report_filename: LOG.debug('Writing report to: %s', report_filename) try: utils.write_file(rendered_template, report_filename) LOG.info('Report saved to: %s', report_filename) except IOError as e: LOG.error('Failed to write report file: %s', e) if book_folder: writer.write_book(book_folder, data)