Add scenarios directory for ci

This directoy contains scenarios to be run by jenkins.

Add script which runs specified scenario and plot graph.

Add abbility to specify cloud by --name in "rally use deployment"

Removed rally/exercises

Change-Id: I7803a6950ec5fce3be11277ae0e4d830f0cf6bad
Related: blueprint rally-gate-jobs
This commit is contained in:
Sergey Skripnick 2014-04-11 18:53:08 +03:00
parent d04111628b
commit b0a2a14e47
9 changed files with 98 additions and 87 deletions

View File

@ -1,46 +0,0 @@
#!/usr/bin/env bash
# **rally.sh**
echo "*********************************************************************"
echo "Begin DevStack Exercise: $0"
echo "*********************************************************************"
# This script exits on an error so that errors don't compound and you see
# only the first error that occurred.
set -o errexit
# Print the commands being run so that we can see the command that triggers
# an error. It is also useful for following allowing as the install occurs.
set -o xtrace
# Settings
# ========
# Keep track of the current directory
EXERCISE_DIR=$(cd $(dirname "$0") && pwd)
TOP_DIR=$(cd $EXERCISE_DIR/..; pwd)
# Import common functions
source $TOP_DIR/functions
# Import configuration
source $TOP_DIR/openrc
# Import exercise configuration
source $TOP_DIR/exerciserc
is_service_enabled rally || exit 55
# Import rally functions
source $TOP_DIR/lib/rally
# Run tests
run_all_benchmarks
set +o xtrace
echo "*********************************************************************"
echo "SUCCESS: End DevStack Exercise: $0"
echo "*********************************************************************"

View File

@ -123,20 +123,6 @@ function init_rally() {
fi fi
} }
# Run benchmarks from samples dir
function run_all_benchmarks() {
for CONF in $DEST/rally/doc/samples/tasks/*/*.yaml; do
case "$CONF" in
*large-ops*)
echo "Skipping large-ops benchmarks."
;;
*)
rally task start --task $CONF
;;
esac
done
}
# Restore xtrace # Restore xtrace
$XTRACE $XTRACE

View File

@ -0,0 +1,18 @@
---
KeystoneBasic.create_delete_user:
-
args:
name_length: 10
runner:
type: "constant"
times: 10
concurrency: 10
KeystoneBasic.create_and_list_tenants:
-
args:
name_length: 10
runner:
type: "constant"
times: 10
concurrency: 10

View File

@ -16,7 +16,6 @@
""" Rally command: use """ """ Rally command: use """
import os import os
import sys
from rally.cmd import cliutils from rally.cmd import cliutils
from rally import db from rally import db
@ -58,14 +57,34 @@ class UseCommands(object):
@cliutils.args('--uuid', type=str, dest='deploy_id', required=False, @cliutils.args('--uuid', type=str, dest='deploy_id', required=False,
help='UUID of the deployment') help='UUID of the deployment')
def deployment(self, deploy_id): @cliutils.args('--name', type=str, dest='name', required=False,
help='Name of the deployment')
def deployment(self, deploy_id=None, name=None):
"""Set the RALLY_DEPLOYMENT env var to be used by all CLI commands """Set the RALLY_DEPLOYMENT env var to be used by all CLI commands
:param deploy_id: a UUID of a deployment :param deploy_id: a UUID of a deployment
""" """
print('Using deployment: %s' % deploy_id) if not (name or deploy_id):
print('You should specify --name or --uuid of deployment')
return 1
deploy = None
if name:
deployments = db.deployment_list(name=name)
if len(deployments) > 1:
print("Multiple deployments found by name: `%s`" % name)
return 1
elif not deployments:
print("There is no `%s` deployment" % name)
return 1
else:
deploy = deployments[0]
deploy_id = deploy["uuid"]
try: try:
deploy = db.deployment_get(deploy_id) deploy = deploy or db.deployment_get(deploy_id)
print('Using deployment: %s' % deploy_id)
self._ensure_rally_configuration_dir_exists() self._ensure_rally_configuration_dir_exists()
self._update_attribute_in_global_file('RALLY_DEPLOYMENT', self._update_attribute_in_global_file('RALLY_DEPLOYMENT',
deploy_id) deploy_id)
@ -80,7 +99,7 @@ class UseCommands(object):
'glance image-list') 'glance image-list')
except exceptions.DeploymentNotFound: except exceptions.DeploymentNotFound:
print('Deployment %s is not found.' % deploy_id) print('Deployment %s is not found.' % deploy_id)
sys.exit(1) return 1
@cliutils.args('--uuid', type=str, dest='task_id', required=False, @cliutils.args('--uuid', type=str, dest='task_id', required=False,
help='UUID of the task') help='UUID of the task')

View File

@ -204,15 +204,17 @@ def deployment_update(uuid, values):
return IMPL.deployment_update(uuid, values) return IMPL.deployment_update(uuid, values)
def deployment_list(status=None, parent_uuid=None): def deployment_list(status=None, parent_uuid=None, name=None):
"""Get list of deployments. """Get list of deployments.
:param status: if None returns any deployments with any status. :param status: if None returns any deployments with any status.
:param parent_uuid: filter by parent. If None, return only "root" :param parent_uuid: filter by parent. If None, return only "root"
deployments. deployments.
:param name: Name of deployment
:returns: a list of dicts with data on the deployments. :returns: a list of dicts with data on the deployments.
""" """
return IMPL.deployment_list(status=status, parent_uuid=parent_uuid) return IMPL.deployment_list(status=status, parent_uuid=parent_uuid,
name=name)
def resource_create(values): def resource_create(values):

View File

@ -22,6 +22,7 @@ import sqlalchemy as sa
from rally.db.sqlalchemy import models from rally.db.sqlalchemy import models
from rally import exceptions from rally import exceptions
from rally.openstack.common.db.sqlalchemy import session as db_session from rally.openstack.common.db.sqlalchemy import session as db_session
from rally.openstack.common.gettextutils import _
CONF = cfg.CONF CONF = cfg.CONF
@ -209,10 +210,13 @@ class Connection(object):
deploy.update(values) deploy.update(values)
return deploy return deploy
def deployment_list(self, status=None, parent_uuid=None): def deployment_list(self, status=None, parent_uuid=None, name=None):
query = self.model_query(models.Deployment).\ query = self.model_query(models.Deployment).\
filter_by(parent_uuid=parent_uuid) filter_by(parent_uuid=parent_uuid)
if status is not None:
if name:
query = query.filter_by(name=name)
if status:
query = query.filter_by(status=status) query = query.filter_by(status=status)
return query.all() return query.all()

View File

@ -18,21 +18,44 @@ import os
import uuid import uuid
from rally.cmd.commands import use from rally.cmd.commands import use
from rally.cmd import envutils
from rally.openstack.common import test from rally.openstack.common import test
from rally import exceptions from rally import exceptions
MOD = 'rally.cmd.commands.use.'
class UseCommandsTestCase(test.BaseTestCase): class UseCommandsTestCase(test.BaseTestCase):
def setUp(self): def setUp(self):
super(UseCommandsTestCase, self).setUp() super(UseCommandsTestCase, self).setUp()
self.use = use.UseCommands() self.use = use.UseCommands()
def test_deployment_use_no_args(self):
status = self.use.deployment()
self.assertEqual(1, status)
@mock.patch(MOD + 'UseCommands._update_openrc_deployment_file')
@mock.patch(MOD + 'UseCommands._update_attribute_in_global_file')
@mock.patch(MOD + 'UseCommands._ensure_rally_configuration_dir_exists')
@mock.patch(MOD + 'db')
def test_deployment_use_by_name(self, m_db, m_ercde, m_uaigf, m_uodf):
fake_deployment = {'uuid': 'fake_uuid',
'endpoints': 'fake_endpoints'}
m_db.deployment_list.return_value = [fake_deployment]
m_db.deployment_get.return_value = fake_deployment
status = self.use.deployment(name='fake_name')
self.assertIsNone(status)
m_db.deployment_list.assert_called_once_with(name='fake_name')
m_ercde.assert_called_once_with()
m_uaigf.assert_called_once_with(envutils.ENV_DEPLOYMENT, 'fake_uuid')
m_uodf.assert_called_once_with('fake_uuid', 'fake_endpoints')
@mock.patch('os.remove') @mock.patch('os.remove')
@mock.patch('os.symlink') @mock.patch('os.symlink')
@mock.patch('rally.cmd.commands.use.db.deployment_get') @mock.patch(MOD + 'db.deployment_get')
@mock.patch('os.path.exists') @mock.patch('os.path.exists')
@mock.patch('rally.cmd.commands.use.fileutils.update_env_file') @mock.patch(MOD + 'fileutils.update_env_file')
def test_deployment(self, mock_env, mock_path, mock_deployment, def test_deployment(self, mock_env, mock_path, mock_deployment,
mock_symlink, mock_remove): mock_symlink, mock_remove):
deploy_id = str(uuid.uuid4()) deploy_id = str(uuid.uuid4())
@ -60,15 +83,15 @@ class UseCommandsTestCase(test.BaseTestCase):
mock_remove.assert_called_once_with(os.path.expanduser( mock_remove.assert_called_once_with(os.path.expanduser(
'~/.rally/openrc')) '~/.rally/openrc'))
@mock.patch('rally.cmd.commands.use.db.deployment_get') @mock.patch(MOD + 'db.deployment_get')
def test_deployment_not_found(self, mock_deployment): def test_deployment_not_found(self, mock_deployment):
deploy_id = str(uuid.uuid4()) deploy_id = str(uuid.uuid4())
mock_deployment.side_effect = exceptions.DeploymentNotFound( mock_deployment.side_effect = exceptions.DeploymentNotFound(
uuid=deploy_id) uuid=deploy_id)
self.assertRaises(SystemExit, self.use.deployment, deploy_id) self.assertEqual(1, self.use.deployment(deploy_id))
@mock.patch('rally.cmd.commands.use.fileutils._rewrite_env_file') @mock.patch(MOD + 'fileutils._rewrite_env_file')
@mock.patch('rally.cmd.commands.use.db.task_get') @mock.patch(MOD + 'db.task_get')
def test_task(self, mock_task, mock_file): def test_task(self, mock_task, mock_file):
task_id = str(uuid.uuid4()) task_id = str(uuid.uuid4())
mock_task.return_value = True mock_task.return_value = True
@ -77,7 +100,7 @@ class UseCommandsTestCase(test.BaseTestCase):
os.path.expanduser('~/.rally/globals'), os.path.expanduser('~/.rally/globals'),
['RALLY_TASK=%s\n' % task_id]) ['RALLY_TASK=%s\n' % task_id])
@mock.patch('rally.cmd.commands.use.db.task_get') @mock.patch(MOD + 'db.task_get')
def test_task_not_found(self, mock_task): def test_task_not_found(self, mock_task):
task_id = str(uuid.uuid4()) task_id = str(uuid.uuid4())
mock_task.side_effect = exceptions.TaskNotFound(uuid=task_id) mock_task.side_effect = exceptions.TaskNotFound(uuid=task_id)

View File

@ -269,14 +269,15 @@ class DeploymentTestCase(test.DBTestCase):
self.assertEqual(sorted([deploy_one['uuid'], deploy_two['uuid']]), self.assertEqual(sorted([deploy_one['uuid'], deploy_two['uuid']]),
sorted([deploy['uuid'] for deploy in deploys])) sorted([deploy['uuid'] for deploy in deploys]))
def test_deployment_list_with_status(self): def test_deployment_list_with_status_and_name(self):
deploy_one = db.deployment_create({}) deploy_one = db.deployment_create({})
deploy_two = db.deployment_create({ deploy_two = db.deployment_create({
'config': {}, 'config': {},
'status': consts.DeployStatus.DEPLOY_FAILED, 'status': consts.DeployStatus.DEPLOY_FAILED,
}) })
deploy_three = db.deployment_create({'name': 'deployment_name'})
deploys = db.deployment_list(status=consts.DeployStatus.DEPLOY_INIT) deploys = db.deployment_list(status=consts.DeployStatus.DEPLOY_INIT)
self.assertEqual(len(deploys), 1) self.assertEqual(len(deploys), 2)
self.assertEqual(deploys[0]['uuid'], deploy_one['uuid']) self.assertEqual(deploys[0]['uuid'], deploy_one['uuid'])
deploys = db.deployment_list(status=consts.DeployStatus.DEPLOY_FAILED) deploys = db.deployment_list(status=consts.DeployStatus.DEPLOY_FAILED)
self.assertEqual(len(deploys), 1) self.assertEqual(len(deploys), 1)
@ -284,6 +285,9 @@ class DeploymentTestCase(test.DBTestCase):
deploys = db.deployment_list( deploys = db.deployment_list(
status=consts.DeployStatus.DEPLOY_FINISHED) status=consts.DeployStatus.DEPLOY_FINISHED)
self.assertEqual(len(deploys), 0) self.assertEqual(len(deploys), 0)
deploys = db.deployment_list(name='deployment_name')
self.assertEqual(deploys[0]['uuid'], deploy_three['uuid'])
self.assertEqual(len(deploys), 1)
def test_deployment_list_parent(self): def test_deployment_list_parent(self):
deploy = db.deployment_create({}) deploy = db.deployment_create({})

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh -ex
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain # not use this file except in compliance with the License. You may obtain
@ -12,13 +12,14 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
# This script is executed inside pre_test_hook function in desvstack gate. # This script is executed by post_test_hook function in desvstack gate.
# Install rally devstack integration PROJECT=`echo $ZUUL_PROJECT | cut -d \/ -f 2`
SCENARIO=$BASE/new/$PROJECT/rally-scenarios/${RALLY_SCENARIO}.yaml
RALLY_BASE=/opt/stack/new/rally rally use deployment --name devstack
DEVSTACK_BASE=/opt/stack/new/devstack rally -dv task start --task $SCENARIO
cp -r $RALLY_BASE/contrib/devstack/* $DEVSTACK_BASE/ mkdir rally-plot
rally task plot2html --out rally-plot/results.html
export ENABLED_SERVICES=rally gzip -9 rally-plot/results.html
export RUN_EXERCISES=rally env