diff options
5 files changed, 712 insertions, 0 deletions
diff --git a/meta-openstack/recipes-devtools/python/python-rally/deployment-existing.json b/meta-openstack/recipes-devtools/python/python-rally/deployment-existing.json new file mode 100644 index 00000000..82498600 --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-rally/deployment-existing.json @@ -0,0 +1,9 @@ +{ + "type": "ExistingCloud", + "endpoint": { + "auth_url": "http://%CONTROLLER_IP%:5000/v2.0/", + "username": "%ADMIN_USER%", + "password": "%ADMIN_PASSWORD%", + "tenant_name": "%ADMIN_TENANT_NAME%" + } +} diff --git a/meta-openstack/recipes-devtools/python/python-rally/rally.conf b/meta-openstack/recipes-devtools/python/python-rally/rally.conf new file mode 100644 index 00000000..1c1f8645 --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-rally/rally.conf @@ -0,0 +1,446 @@ +[DEFAULT] + +# +# Options defined in rally.exceptions +# + +# make exception message format errors fatal (boolean value) +#fatal_exception_format_errors=false + + +# +# Options defined in rally.openstack.common.lockutils +# + +# Whether to disable inter-process locks (boolean value) +#disable_process_locking=false + +# Directory to use for lock files. (string value) +#lock_path=<None> + + +# +# Options defined in rally.openstack.common.log +# + +# Print debugging output (set logging level to DEBUG instead +# of default WARNING level). (boolean value) +#debug=false + +# Print more verbose output (set logging level to INFO instead +# of default WARNING level). (boolean value) +#verbose=false + +# Log output to standard error (boolean value) +#use_stderr=true + +# Format string to use for log messages with context (string +# value) +#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s + +# Format string to use for log messages without context +# (string value) +#logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s + +# Data to append to log format when level is DEBUG (string +# value) +#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d + +# Prefix each line of exception output with this format +# (string value) +#logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s + +# List of logger=LEVEL pairs (list value) +#default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN + +# Publish error events (boolean value) +#publish_errors=false + +# Make deprecations fatal (boolean value) +#fatal_deprecations=false + +# If an instance is passed with the log message, format it +# like this (string value) +#instance_format="[instance: %(uuid)s] " + +# If an instance UUID is passed with the log message, format +# it like this (string value) +#instance_uuid_format="[instance: %(uuid)s] " + +# The name of logging configuration file. It does not disable +# existing loggers, but just appends specified logging +# configuration to any other existing logging options. Please +# see the Python logging module documentation for details on +# logging configuration files. (string value) +# Deprecated group/name - [DEFAULT]/log_config +#log_config_append=<None> + +# DEPRECATED. A logging.Formatter log message format string +# which may use any of the available logging.LogRecord +# attributes. This option is deprecated. Please use +# logging_context_format_string and +# logging_default_format_string instead. (string value) +#log_format=<None> + +# Format string for %%(asctime)s in log records. Default: +# %(default)s (string value) +#log_date_format=%Y-%m-%d %H:%M:%S + +# (Optional) Name of log file to output to. If no default is +# set, logging will go to stdout. (string value) +# Deprecated group/name - [DEFAULT]/logfile +#log_file=<None> + +# (Optional) The base directory used for relative --log-file +# paths (string value) +# Deprecated group/name - [DEFAULT]/logdir +log_dir=/var/log/rally + +# Use syslog for logging. Existing syslog format is DEPRECATED +# during I, and then will be changed in J to honor RFC5424 +# (boolean value) +#use_syslog=false + +# (Optional) Use syslog rfc5424 format for logging. If +# enabled, will add APP-NAME (RFC5424) before the MSG part of +# the syslog message. The old format without APP-NAME is +# deprecated in I, and will be removed in J. (boolean value) +#use_syslog_rfc_format=false + +# Syslog facility to receive log lines (string value) +#syslog_log_facility=LOG_USER + +# +# Options defined in rally.osclients +# + +# HTTP timeout for any of OpenStack service in seconds +#openstack_client_http_timeout=180.0 + +# Use SSL for all OpenStack API interfaces +#https_insecure=False + +# Path to CA server cetrificate for SSL +#https_cacert=<None> + +[benchmark] + +# +# Options defined in rally.benchmark.scenarios.cinder.utils +# + +# Time to sleep after creating a resource before polling for +# it status (floating point value) +#cinder_volume_create_prepoll_delay=2.0 + +# Time to wait for cinder volume to be created. (floating +# point value) +#cinder_volume_create_timeout=600.0 + +# Interval between checks when waiting for volume creation. +# (floating point value) +#cinder_volume_create_poll_interval=2.0 + +# Time to wait for cinder volume to be deleted. (floating +# point value) +#cinder_volume_delete_timeout=600.0 + +# Interval between checks when waiting for volume deletion. +# (floating point value) +#cinder_volume_delete_poll_interval=2.0 + + +# +# Options defined in rally.benchmark.scenarios.glance.utils +# + +# Time to sleep after creating a resource before polling for +# it status (floating point value) +#glance_image_create_prepoll_delay=2.0 + +# Time to wait for glance image to be created. (floating point +# value) +#glance_image_create_timeout=120.0 + +# Interval between checks when waiting for image creation. +# (floating point value) +#glance_image_create_poll_interval=1.0 + +# Time to wait for glance image to be deleted. (floating point +# value) +#glance_image_delete_timeout=120.0 + +# Interval between checks when waiting for image deletion. +# (floating point value) +#glance_image_delete_poll_interval=1.0 + + +# +# Options defined in rally.benchmark.scenarios.heat.utils +# + +# Time to sleep after creating a resource before polling for +# it status (floating point value) +#heat_stack_create_prepoll_delay=2.0 + +# Time to wait for heat stack to be created. (floating point +# value) +#heat_stack_create_timeout=3600.0 + +# Interval between checks when waiting for stack creation. +# (floating point value) +#heat_stack_create_poll_interval=1.0 + +# Time to wait for heat stack to be deleted. (floating point +# value) +#heat_stack_delete_timeout=3600.0 + +# Interval between checks when waiting for stack deletion. +# (floating point value) +#heat_stack_delete_poll_interval=1.0 + + +# +# Options defined in rally.benchmark.scenarios.nova.utils +# + +# Time to sleep after start before polling for status +# (floating point value) +#nova_server_start_prepoll_delay=0.0 + +# Server start timeout (floating point value) +#nova_server_start_timeout=300.0 + +# Server start poll interval (floating point value) +#nova_server_start_poll_interval=1.0 + +# Time to sleep after stop before polling for status (floating +# point value) +#nova_server_stop_prepoll_delay=0.0 + +# Server stop timeout (floating point value) +#nova_server_stop_timeout=300.0 + +# Server stop poll interval (floating point value) +#nova_server_stop_poll_interval=2.0 + +# Time to sleep after boot before polling for status (floating +# point value) +#nova_server_boot_prepoll_delay=1.0 + +# Server boot timeout (floating point value) +#nova_server_boot_timeout=300.0 + +# Server boot poll interval (floating point value) +#nova_server_boot_poll_interval=1.0 + +# Time to sleep after delete before polling for status +# (floating point value) +#nova_server_delete_prepoll_delay=2.0 + +# Server delete timeout (floating point value) +#nova_server_delete_timeout=300.0 + +# Server delete poll interval (floating point value) +#nova_server_delete_poll_interval=2.0 + +# Time to sleep after reboot before polling for status +# (floating point value) +#nova_server_reboot_prepoll_delay=2.0 + +# Server reboot timeout (floating point value) +#nova_server_reboot_timeout=300.0 + +# Server reboot poll interval (floating point value) +#nova_server_reboot_poll_interval=2.0 + +# Time to sleep after rescue before polling for status +# (floating point value) +#nova_server_rescue_prepoll_delay=2.0 + +# Server rescue timeout (floating point value) +#nova_server_rescue_timeout=300.0 + +# Server rescue poll interval (floating point value) +#nova_server_rescue_poll_interval=2.0 + +# Time to sleep after unrescue before polling for status +# (floating point value) +#nova_server_unrescue_prepoll_delay=2.0 + +# Server unrescue timeout (floating point value) +#nova_server_unrescue_timeout=300.0 + +# Server unrescue poll interval (floating point value) +#nova_server_unrescue_poll_interval=2.0 + +# Time to sleep after suspend before polling for status +# (floating point value) +#nova_server_suspend_prepoll_delay=2.0 + +# Server suspend timeout (floating point value) +#nova_server_suspend_timeout=300.0 + +# Server suspend poll interval (floating point value) +#nova_server_suspend_poll_interval=2.0 + +# Time to sleep after image_create before polling for status +# (floating point value) +#nova_server_image_create_prepoll_delay=0.0 + +# Server image_create timeout (floating point value) +#nova_server_image_create_timeout=300.0 + +# Server image_create poll interval (floating point value) +#nova_server_image_create_poll_interval=2.0 + +# Time to sleep after image_delete before polling for status +# (floating point value) +#nova_server_image_delete_prepoll_delay=0.0 + +# Server image_delete timeout (floating point value) +#nova_server_image_delete_timeout=300.0 + +# Server image_delete poll interval (floating point value) +#nova_server_image_delete_poll_interval=2.0 + + +[database] + +# +# Options defined in rally.openstack.common.db.options +# + +# The file name to use with SQLite (string value) +#sqlite_db=rally.sqlite + +# If True, SQLite uses synchronous mode (boolean value) +#sqlite_synchronous=true + +# The backend to use for db (string value) +# Deprecated group/name - [DEFAULT]/db_backend +#backend=sqlalchemy + +# The SQLAlchemy connection string used to connect to the +# database (string value) +# Deprecated group/name - [DEFAULT]/sql_connection +# Deprecated group/name - [DATABASE]/sql_connection +# Deprecated group/name - [sql]/connection +connection=postgresql://%DB_USER%:%DB_PASSWORD%@localhost/rally + +# The SQL mode to be used for MySQL sessions. This option, +# including the default, overrides any server-set SQL mode. To +# use whatever SQL mode is set by the server configuration, +# set this to no value. Example: mysql_sql_mode= (string +# value) +#mysql_sql_mode=TRADITIONAL + +# Timeout before idle sql connections are reaped (integer +# value) +# Deprecated group/name - [DEFAULT]/sql_idle_timeout +# Deprecated group/name - [DATABASE]/sql_idle_timeout +# Deprecated group/name - [sql]/idle_timeout +#idle_timeout=3600 + +# Minimum number of SQL connections to keep open in a pool +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_min_pool_size +# Deprecated group/name - [DATABASE]/sql_min_pool_size +#min_pool_size=1 + +# Maximum number of SQL connections to keep open in a pool +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_pool_size +# Deprecated group/name - [DATABASE]/sql_max_pool_size +#max_pool_size=<None> + +# Maximum db connection retries during startup. (setting -1 +# implies an infinite retry count) (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_retries +# Deprecated group/name - [DATABASE]/sql_max_retries +#max_retries=10 + +# Interval between retries of opening a sql connection +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_retry_interval +# Deprecated group/name - [DATABASE]/reconnect_interval +#retry_interval=10 + +# If set, use this value for max_overflow with sqlalchemy +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_overflow +# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow +#max_overflow=<None> + +# Verbosity of SQL debugging information. 0=None, +# 100=Everything (integer value) +# Deprecated group/name - [DEFAULT]/sql_connection_debug +#connection_debug=0 + +# Add python stack traces to SQL as comment strings (boolean +# value) +# Deprecated group/name - [DEFAULT]/sql_connection_trace +#connection_trace=false + +# If set, use this value for pool_timeout with sqlalchemy +# (integer value) +# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout +#pool_timeout=<None> + +# Enable the experimental use of database reconnect on +# connection lost (boolean value) +#use_db_reconnect=false + +# seconds between db connection retries (integer value) +#db_retry_interval=1 + +# Whether to increase interval between db connection retries, +# up to db_max_retry_interval (boolean value) +#db_inc_retry_interval=true + +# max seconds between db connection retries, if +# db_inc_retry_interval is enabled (integer value) +#db_max_retry_interval=10 + +# maximum db connection retries before error is raised. +# (setting -1 implies an infinite retry count) (integer value) +#db_max_retries=20 + + +[image] + +# +# Options defined in rally.verification.verifiers.tempest.config +# + +# Version of cirros image (string value) +#cirros_version=0.3.2 + +# Cirros image name (string value) +#cirros_image=cirros-0.3.2-x86_64-disk.img + + +[rest] + +# +# Options defined in rally.aas.rest +# + +# The port for the Rally API server (integer value) +#port=8877 + +# The listen IP for the Rally API server (string value) +#host=0.0.0.0 + + +[users_context] + +# +# Options defined in rally.benchmark.context.users +# + +# How many concurrent threads use for serving users context +# (integer value) +#concurrent=30 + + diff --git a/meta-openstack/recipes-devtools/python/python-rally/rally.init b/meta-openstack/recipes-devtools/python/python-rally/rally.init new file mode 100644 index 00000000..e8345475 --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-rally/rally.init @@ -0,0 +1,95 @@ +#!/bin/sh + +### BEGIN INIT INFO +# Provides: rally +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Should-Start: postgresql rabbitmq-server +# Should-Stop: postgresql rabbitmq-server +# Default-Start: 3 5 +# Default-Stop: 0 1 2 6 +# Short-Description: OpenStack Block Storage (Rally) - API +# Description: OpenStack Block Storage (Rally) - API +### END INIT INFO + +SUFFIX=@suffix@ +DESC="rally-$SUFFIX" +DAEMON="/usr/bin/rally-$SUFFIX" +PIDFILE="/var/run/rally-$SUFFIX.pid" + +start() +{ + if [ -e $PIDFILE ]; then + PIDDIR=/proc/$(cat $PIDFILE) + if [ -d ${PIDDIR} ]; then + echo "$DESC already running." + exit 1 + else + echo "Removing stale PID file $PIDFILE" + rm -f $PIDFILE + fi + fi + + if [ ! -d /var/log/rally ]; then + mkdir /var/log/rally + fi + + echo -n "Starting $DESC..." + + start-stop-daemon --start --quiet --background \ + --pidfile ${PIDFILE} --make-pidfile --exec ${DAEMON} \ + -- --log-dir=/var/log/rally + + if [ $? -eq 0 ]; then + echo "done." + else + echo "failed." + fi +} + +stop() +{ + echo -n "Stopping $DESC..." + start-stop-daemon --stop --quiet --pidfile $PIDFILE + if [ $? -eq 0 ]; then + echo "done." + else + echo "failed." + fi + rm -f $PIDFILE +} + +status() +{ + pid=`cat $PIDFILE 2>/dev/null` + if [ -n "$pid" ]; then + if ps -p $pid >&- ; then + echo "$DESC is running" + return + fi + fi + echo "$DESC is not running" +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|force-reload|reload) + stop + start + ;; + status) + status + ;; + *) + echo "Usage: $0 {start|stop|force-reload|restart|reload|status}" + exit 1 + ;; +esac + +exit 0 + diff --git a/meta-openstack/recipes-devtools/python/python-rally/task-example.json b/meta-openstack/recipes-devtools/python/python-rally/task-example.json new file mode 100644 index 00000000..381bb96d --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-rally/task-example.json @@ -0,0 +1,17 @@ +{ + "Authenticate.keystone": [ + { + "runner": { + "type": "constant", + "times": 100, + "concurrency": 5 + }, + "context": { + "users": { + "tenants": 3, + "users_per_tenant": 50 + } + } + } + ] +} diff --git a/meta-openstack/recipes-devtools/python/python-rally_git.bb b/meta-openstack/recipes-devtools/python/python-rally_git.bb new file mode 100644 index 00000000..811fd07c --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-rally_git.bb @@ -0,0 +1,145 @@ +DESCRIPTION = "Rally - OpenStack benchmarking at a scale - is intended to provide the \ +community with a benchmarking tool that is capable of performing specific, \ +complicated and reproducible test cases on real deployment scenarios." +HOMEPAGE = "https://launchpad.net/rally" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=19cbd64715b51267a47bf3750cc6a8a5" + +PR = "r0" +SRCNAME = "rally" + +SRC_URI = "git://github.com/stackforge/${SRCNAME}.git;branch=master \ + file://rally.init \ + file://rally.conf \ + file://task-example.json \ + file://deployment-existing.json \ +" + +SRCREV="b297cf00750f263b8b5bdeb71f6952f672e87f5a" +PV="git${SRCPV}" +S = "${WORKDIR}/git" + +inherit setuptools update-rc.d hosts identity default_configs + +do_install_append() { + RALLY_CONF_DIR=${D}${sysconfdir}/${SRCNAME} + RALLY_PYTHON_SITEPACKAGES_DIR=${D}${PYTHON_SITEPACKAGES_DIR}/${SRCNAME} + + install -d ${RALLY_CONF_DIR} + install -m 600 ${WORKDIR}/rally.conf ${RALLY_CONF_DIR}/rally.conf + sed -e "s:%DB_USER%:${DB_USER}:g" -i ${RALLY_CONF_DIR}/rally.conf + sed -e "s:%DB_PASSWORD%:${DB_PASSWORD}:g" -i ${RALLY_CONF_DIR}/rally.conf + + if ${@base_contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then + install -d ${D}${sysconfdir}/init.d + sed 's:@suffix@:api:' < ${WORKDIR}/rally.init > ${WORKDIR}/rally-api.init.sh + install -m 0755 ${WORKDIR}/rally-api.init.sh ${D}${sysconfdir}/init.d/rally-api + fi + + install -d ${RALLY_PYTHON_SITEPACKAGES_DIR} + cp -r ${S}/tests* ${RALLY_PYTHON_SITEPACKAGES_DIR} + find ${RALLY_PYTHON_SITEPACKAGES_DIR}/tests* -name "*.py" | xargs \ + sed -i 's:^from tests:from rally.tests:g' + install -d ${RALLY_PYTHON_SITEPACKAGES_DIR}/doc/samples + cp -r ${S}/doc/samples/* ${RALLY_PYTHON_SITEPACKAGES_DIR}/doc/samples + + install -d ${RALLY_CONF_DIR}/tasks + install -m 600 ${WORKDIR}/task-example.json ${RALLY_CONF_DIR}/tasks/example.json + + install -d ${RALLY_CONF_DIR}/deployments + install -m 600 ${WORKDIR}/deployment-existing.json ${RALLY_CONF_DIR}/deployments/existing.json + sed -e "s:%ADMIN_TENANT_NAME%:admin:g" -i ${RALLY_CONF_DIR}/deployments/existing.json + sed -e "s:%ADMIN_USER%:admin:g" -i ${RALLY_CONF_DIR}/deployments/existing.json + sed -e "s:%ADMIN_PASSWORD%:${ADMIN_PASSWORD}:g" -i ${RALLY_CONF_DIR}/deployments/existing.json + sed -e "s:%CONTROLLER_IP%:${CONTROLLER_IP}:g" -i ${RALLY_CONF_DIR}/deployments/existing.json + + cp ${S}/run_tests.sh ${RALLY_CONF_DIR} + cp -r ${S}/tools ${RALLY_CONF_DIR} +} + +pkg_postinst_${SRCNAME}-setup () { + if [ "x$D" != "x" ]; then + exit 1 + fi + + # This is to make sure postgres is configured and running + if ! pidof postmaster > /dev/null; then + /etc/init.d/postgresql-init + /etc/init.d/postgresql start + fi + + if [ ! -d /var/log/rally ]; then + mkdir /var/log/rally + fi + + sudo -u postgres createdb rally + rally-manage db recreate +} + +PACKAGES += "${SRCNAME}-tests ${SRCNAME}-api ${SRCNAME} ${SRCNAME}-setup" +ALLOW_EMPTY_${SRCNAME}-setup = "1" + +FILES_${PN} = "${libdir}/*" + +FILES_${SRCNAME}-tests = "${sysconfdir}/${SRCNAME}/run_tests.sh \ + " + +FILES_${SRCNAME} = "${bindir}/* \ + ${sysconfdir}/${SRCNAME}/* \ + " + +FILES_${SRCNAME}-api = "${bindir}/rally-api \ + ${sysconfdir}/init.d/rally-api \ + " + +DEPENDS += " \ + python-pip \ + python-pbr \ + " + +RDEPENDS_${PN} += " python-babel \ + python-decorator \ + python-fixtures \ + python-iso8601 \ + python-jsonschema \ + python-netaddr \ + python-oslo.config \ + python-paramiko \ + python-pbr \ + python-pecan \ + python-prettytable \ + python-pyyaml \ + python-glanceclient \ + python-keystoneclient \ + python-novaclient \ + python-neutronclient \ + python-cinderclient \ + python-heatclient \ + python-ceilometerclient \ + python-subunit \ + python-requests \ + python-sqlalchemy \ + python-six \ + python-wsme \ + " + +RDEPENDS_${SRCNAME}-tests = "${PN} \ + python-coverage \ + python-mock \ + python-testrepository \ + python-testtools \ + python-oslotest \ + " + +RDEPENDS_${SRCNAME} = "${PN} \ + postgresql \ + postgresql-client \ + " + +RDEPENDS_${SRCNAME}-setup = "postgresql sudo ${SRCNAME}" +RDEPENDS_${SRCNAME}-api = "${SRCNAME}" + +INITSCRIPT_PACKAGES = "${SRCNAME}-api" +INITSCRIPT_NAME_${SRCNAME}-api = "${SRCNAME}-api" +INITSCRIPT_PARAMS_${SRCNAME}-api = "${OS_DEFAULT_INITSCRIPT_PARAMS}" |