Remove ansible api due to 1.9.4 confusion and bugs.

+ Adjusted workloads to positional args and is flexiable to take:
  - ./browbeat.py                      ---> Runs all worklaods in order: perfkit rally shaker
  - ./browbeat.py all                  ---> Runs all workloads in order: perfkit rally shaker
  - ./browbeat.py perfkit rally        ---> Runs workloads in order: perfkit rally
  - ./browbeat.py shaker rally perfkit ---> Runs workloads in order: shaker rally perfkit
+ --debug now displays debug messages in stdout in addition to previous locations it logged
+ --setup or -s to take a config, Defaults to browbeat-config.yaml (Same as before), Examples:
  - ./browbeat.py -s browbeat-complete.yaml rally
  - ./browbeat.py -s conf/browbeat-keystone-complete.yaml --debug
+ Use __init__.py to allow cleaner importing of files under lib/
+ Remove ansible version restriction in requirements.txt
+ Separate connmon config from browbeat config for clarity.

Change-Id: Ifb74e5868be128fb378c7b052ba5a1bea46b4dff
This commit is contained in:
Alex Krzos 2016-03-22 23:10:57 -04:00
parent ea89825195
commit cc5fee596b
11 changed files with 83 additions and 177 deletions

View File

@ -1,22 +1,18 @@
# Complete set of Stress Tests, this can take a long time (day(s))
browbeat:
results : results/
sudo: true
connmon: false
rerun: 3
ansible:
hosts: ansible/hosts
install:
connmon: ansible/install/connmon.yml
browbeat: ansible/install/browbeat.yml
check: ansible/check/site.yml
adjust:
keystone_token: ansible/browbeat/adjustment-keystone-token.yml
neutron_l3: ansible/browbeat/adjustment-l3.yml
nova_db: ansible/browbeat/adjustment-db.yml
workers: ansible/browbeat/adjustment-workers.yml
grafana_snapshot: ansible/browbeat/snapshot-general-performance-dashboard.yml
shaker_build: ansible/install/shaker_build.yml
connmon:
enabled: false
sudo: true
grafana:
enabled: true
cloud_name: openstack

View File

@ -1,22 +1,18 @@
# Basic set of initial stress tests to test overcloud before running complete set of benchmarks.
browbeat:
results : results/
sudo: true
connmon: false
rerun: 1
ansible:
hosts: ansible/hosts
install:
connmon: ansible/install/connmon.yml
browbeat: ansible/install/browbeat.yml
check: ansible/check/site.yml
adjust:
keystone_token: ansible/browbeat/adjustment-keystone-token.yml
neutron_l3: ansible/browbeat/adjustment-l3.yml
nova_db: ansible/browbeat/adjustment-db.yml
workers: ansible/browbeat/adjustment-workers.yml
grafana_snapshot: ansible/browbeat/snapshot-general-performance-dashboard.yml
shaker_build: ansible/install/shaker_build.yml
connmon:
enabled: false
sudo: true
grafana:
enabled: true
cloud_name: openstack

View File

@ -1,164 +1,91 @@
#!/usr/bin/env python
from lib.PerfKit import PerfKit
from lib.Rally import Rally
from lib.Shaker import Shaker
import argparse
import yaml
import logging
import sys
sys.path.append('lib/')
from PerfKit import PerfKit
from Tools import *
from Rally import *
from Shaker import *
import ConfigParser, os
import yaml
# Setting up our logger
_logger = logging.getLogger('browbeat')
_logger.setLevel(logging.DEBUG)
_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)7s - %(message)s')
_dbg_file = logging.FileHandler('log/debug.log')
_dbg_file.setLevel(logging.DEBUG)
_dbg_file.setFormatter(_formatter)
_ch = logging.StreamHandler()
_ch.setLevel(logging.INFO)
_ch.setFormatter(_formatter)
_logger.addHandler(_dbg_file)
_logger.addHandler(_ch)
# import ansible
try :
from ansible.playbook import PlayBook
from ansible import callbacks
from ansible import utils
except ImportError :
_logger.error("Unable to import Ansible API. This code is not Ansible 2.0 ready")
exit(1)
# Browbeat specific options
_install_opts = ['connmon', 'browbeat', 'shaker-build']
_workload_opts = ['perfkit', 'rally', 'shaker']
_config_file = 'browbeat-config.yaml'
_config = None
debug_log_file = 'log/debug.log'
# Load Config file
def _load_config(path):
stream = open(path, 'r')
config=yaml.load(stream)
stream.close()
def _load_config(config_file):
with open(config_file, 'r') as stream_conf_file:
config = yaml.load(stream_conf_file)
return config
# Run Ansible Playbook
def _run_playbook(path, hosts, only_tag=None, skip_tag=None):
stats = callbacks.AggregateStats()
playbook_cb = callbacks.PlaybookCallbacks(verbose=1)
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=1)
play = PlayBook(playbook=path,
host_list=hosts,
stats=stats,
only_tags=only_tag,
skip_tags=skip_tag,
callbacks=playbook_cb,
runner_callbacks=runner_cb)
return play.run()
def _run_workload_provider(provider, ansible_hosts=None):
def _run_workload_provider(provider, config):
_logger = logging.getLogger('browbeat')
if provider == "perfkit":
perfkit = PerfKit(_config)
perfkit = PerfKit(config)
perfkit.start_workloads()
elif provider == "rally":
rally = Rally(_config, ansible_hosts)
rally = Rally(config)
rally.start_workloads()
elif provider == "shaker":
shaker = Shaker(_config)
shaker = Shaker(config)
shaker.run_shaker()
else:
_logger.error("Unknown workload provider: {}".format(provider))
#
# Browbeat Main
#
if __name__ == '__main__':
_cli=argparse.ArgumentParser(description="Browbeat automated scripts")
_cli.add_argument('-n','--hosts',nargs=1,
help='Provide Ansible hosts file to use. Default is ansible/hosts')
_cli.add_argument('-s', '--setup', nargs='?', default = _config_file,
help='Provide Setup YAML for browbeat. Default is ./browbeat-config.yaml')
_cli.add_argument('-c','--check',action='store_true',
help='Run the Browbeat Overcloud Checks')
_cli.add_argument('-w', '--workloads', nargs='*', help='Run Browbeat workload(s). Takes a space'
' separated list of workloads ({}) or \"all\"'.format(', '.join(_workload_opts)))
_cli.add_argument('-i', '--install', nargs=1, choices=_install_opts, dest='install',
help='Install/Setup Browbeat Tools/Workloads')
_cli.add_argument('--debug',action='store_true',
help='Enable Debug messages')
_cli_args = _cli.parse_args()
if _cli_args.debug :
_logger.setLevel(logging.DEBUG)
def main():
parser = argparse.ArgumentParser(
description="Browbeat Performance and Scale testing for Openstack")
parser.add_argument('-s', '--setup', nargs='?', default=_config_file,
help='Provide Browbeat YAML configuration file. Default is ./{}'.format(_config_file))
parser.add_argument('workloads', nargs='*', help='Browbeat workload(s). Takes a space separated'
' list of workloads ({}) or \"all\"'.format(', '.join(_workload_opts)))
parser.add_argument('--debug', action='store_true', help='Enable Debug messages')
_cli_args = parser.parse_args()
#
# Install Tool(s)
#
if _cli_args.install :
_config=_load_config(_cli_args.setup)
hosts_path=_config['ansible']['hosts']
if _cli_args.hosts :
_logger.info("Loading new hosts file : %s"% _cli_args.hosts[0])
hosts_path=_cli_args.hosts
if _cli_args.install[0] == 'all' :
for tool in _install_opts:
if tool == "shaker-build":
_run_playbook(_config['ansible']['shaker_build'],hosts_path)
else:
_run_playbook(_config['ansible']['install'][tool],hosts_path)
_logger = logging.getLogger('browbeat')
_logger.setLevel(logging.DEBUG)
_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)7s - %(message)s')
_dbg_file = logging.FileHandler(debug_log_file)
_dbg_file.setLevel(logging.DEBUG)
_dbg_file.setFormatter(_formatter)
_ch = logging.StreamHandler()
if _cli_args.debug:
_ch.setLevel(logging.DEBUG)
else:
_ch.setLevel(logging.INFO)
_ch.setFormatter(_formatter)
_logger.addHandler(_dbg_file)
_logger.addHandler(_ch)
elif _cli_args.install[0] in _install_opts :
if _cli_args.install[0] == "shaker-build":
_run_playbook(_config['ansible']['shaker_build'],hosts_path)
else:
_run_playbook(_config['ansible']['install'][_cli_args.install[0]],hosts_path)
_logger.debug("CLI Args: {}".format(_cli_args))
#
# Overcloud check
#
if _cli_args.check :
_config=_load_config(_cli_args.setup)
hosts_path=_config['ansible']['hosts']
if _cli_args.hosts :
_logger.info("Loading new hosts file : %s"% _cli_args.hosts[0])
hosts_path=_cli_args.hosts
_run_playbook(_config['ansible']['check'],hosts_path)
# Run workloads:
hosts = None
# Load Browbeat yaml config file:
_config = _load_config(_cli_args.setup)
hosts_path = _config['ansible']['hosts']
# Default to all workloads
if _cli_args.workloads == []:
_cli_args.workloads.append('all')
if _cli_args.workloads:
if len(_cli_args.workloads) == 1 and 'all' in _cli_args.workloads:
_cli_args.workloads = _workload_opts
invalid_wkld = [wkld for wkld in _cli_args.workloads if wkld not in _workload_opts]
if invalid_wkld:
_logger.error("Invalid workload(s) specified: {}".format(invalid_wkld))
if 'all' in _cli_args.workloads:
_logger.error("If you meant 'all' use: './browbeat.py -w all' or "
"'./browbeat.py -w'")
exit(1)
else:
_logger.info("Running workload(s): {}".format(','.join(_cli_args.workloads)))
if _cli_args.hosts:
_logger.info("Loading new hosts file: {}".format(_cli_args.hosts[0]))
hosts_path = _cli_args.hosts
for wkld_provider in _cli_args.workloads:
if wkld_provider in _config:
if _config[wkld_provider]['enabled']:
_run_workload_provider(wkld_provider, hosts_path)
else:
_logger.warning("{} is not enabled in {}".format(wkld_provider,
_cli_args.setup))
if len(_cli_args.workloads) == 1 and 'all' in _cli_args.workloads:
_cli_args.workloads = _workload_opts
invalid_wkld = [wkld for wkld in _cli_args.workloads if wkld not in _workload_opts]
if invalid_wkld:
_logger.error("Invalid workload(s) specified: {}".format(invalid_wkld))
if 'all' in _cli_args.workloads:
_logger.error("If you meant 'all' use: './browbeat.py all' or './browbeat.py'")
exit(1)
else:
_logger.info("Running workload(s): {}".format(','.join(_cli_args.workloads)))
for wkld_provider in _cli_args.workloads:
if wkld_provider in _config:
if _config[wkld_provider]['enabled']:
_run_workload_provider(wkld_provider, _config)
else:
_logger.error("{} is missing in {}".format(wkld_provider, _cli_args.setup))
_logger.warning("{} is not enabled in {}".format(wkld_provider,
_cli_args.setup))
else:
_logger.error("{} is missing in {}".format(wkld_provider, _cli_args.setup))
if __name__ == '__main__':
sys.exit(main())

View File

@ -2,22 +2,18 @@
# This testing will take days to complete. (You have been warned)
browbeat:
results : results/
sudo: true
connmon: false
rerun: 3
ansible:
hosts: ansible/hosts
install:
connmon: ansible/install/connmon.yml
browbeat: ansible/install/browbeat.yml
check: ansible/check/site.yml
adjust:
keystone_token: ansible/browbeat/adjustment-keystone-token.yml
neutron_l3: ansible/browbeat/adjustment-l3.yml
nova_db: ansible/browbeat/adjustment-db.yml
workers: ansible/browbeat/adjustment-workers.yml
grafana_snapshot: ansible/browbeat/snapshot-general-performance-dashboard.yml
shaker_build: ansible/install/shaker_build.yml
connmon:
enabled: false
sudo: true
grafana:
enabled: false
cloud_name: openstack

View File

@ -2,22 +2,18 @@
# Good sanity test to see if OSP will be able to handle the longer stress tests.
browbeat:
results : results/
sudo: true
connmon: false
rerun: 1
ansible:
hosts: ansible/hosts
install:
connmon: ansible/install/connmon.yml
browbeat: ansible/install/browbeat.yml
check: ansible/check/site.yml
adjust:
keystone_token: ansible/browbeat/adjustment-keystone-token.yml
neutron_l3: ansible/browbeat/adjustment-l3.yml
nova_db: ansible/browbeat/adjustment-db.yml
workers: ansible/browbeat/adjustment-workers.yml
grafana_snapshot: ansible/browbeat/snapshot-general-performance-dashboard.yml
shaker_build: ansible/install/shaker_build.yml
connmon:
enabled: false
sudo: true
grafana:
enabled: false
cloud_name: openstack

View File

@ -1,22 +1,18 @@
# Complete set of PerfKit Benchmarks run from Browbeat
browbeat:
results : results/
sudo: true
connmon: false
rerun: 3
ansible:
hosts: ansible/hosts
install:
connmon: ansible/install/connmon.yml
browbeat: ansible/install/browbeat.yml
check: ansible/check/site.yml
adjust:
keystone_token: ansible/browbeat/adjustment-keystone-token.yml
neutron_l3: ansible/browbeat/adjustment-l3.yml
nova_db: ansible/browbeat/adjustment-db.yml
workers: ansible/browbeat/adjustment-workers.yml
grafana_snapshot: ansible/browbeat/snapshot-general-performance-dashboard.yml
shaker_build: ansible/install/shaker_build.yml
connmon:
enabled: false
sudo: true
grafana:
enabled: false
cloud_name: openstack

View File

@ -14,7 +14,7 @@ class Connmon :
connmond=self.tools.find_cmd(tool)
if not connmond :
self.logger.error("Unable to find {}".format(tool))
as_sudo = self.config['browbeat']['sudo']
as_sudo = self.config['connmon']['sudo']
cmd = ""
if as_sudo :
cmd +="sudo "

View File

@ -52,7 +52,7 @@ class PerfKit:
if os.path.exists("/tmp/perfkitbenchmarker/run_browbeat"):
shutil.rmtree("/tmp/perfkitbenchmarker/run_browbeat")
if self.config['browbeat']['connmon']:
if self.config['connmon']['enabled']:
self.connmon.start_connmon()
# Run PerfKit
@ -69,7 +69,7 @@ class PerfKit:
to_ts = int(time.time() * 1000)
# Stop connmon at end of perfkit task
if self.config['browbeat']['connmon']:
if self.config['connmon']['enabled']:
self.connmon.stop_connmon()
try:
self.connmon.move_connmon_results(result_dir, test_name)

View File

@ -12,7 +12,7 @@ import time
class Rally:
def __init__(self, config, hosts=None):
def __init__(self, config):
self.logger = logging.getLogger('browbeat.Rally')
self.config = config
self.tools = Tools(self.config)
@ -154,14 +154,13 @@ class Rally:
exit(1)
# Start connmon before rally
if self.config['browbeat']['connmon']:
if self.config['connmon']['enabled']:
self.connmon.start_connmon()
self.run_scenario(scenario_file, scenario, result_dir,
test_name)
self.run_scenario(scenario_file, scenario, result_dir, test_name)
# Stop connmon at end of rally task
if self.config['browbeat']['connmon']:
if self.config['connmon']['enabled']:
self.connmon.stop_connmon()
try:
self.connmon.move_connmon_results(result_dir, test_name)

0
lib/__init__.py Normal file
View File

View File

@ -1,2 +1,2 @@
ansible==1.9.4
ansible
matplotlib