aboutsummaryrefslogtreecommitdiffstats
path: root/functest/opnfv_tests/openstack/rally/rally.py
diff options
context:
space:
mode:
Diffstat (limited to 'functest/opnfv_tests/openstack/rally/rally.py')
-rw-r--r--functest/opnfv_tests/openstack/rally/rally.py98
1 files changed, 37 insertions, 61 deletions
diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py
index b450580c7..592809b76 100644
--- a/functest/opnfv_tests/openstack/rally/rally.py
+++ b/functest/opnfv_tests/openstack/rally/rally.py
@@ -22,10 +22,10 @@ import shutil
import subprocess
import time
-from threading import Timer
import pkg_resources
import prettytable
from ruamel.yaml import YAML
+import six
from six.moves import configparser
from xtesting.core import testcase
import yaml
@@ -33,6 +33,7 @@ import yaml
from functest.core import singlevm
from functest.utils import config
from functest.utils import env
+from functest.utils import functest_utils
LOGGER = logging.getLogger(__name__)
@@ -42,7 +43,7 @@ class RallyBase(singlevm.VmReady2):
# pylint: disable=too-many-instance-attributes, too-many-public-methods
stests = ['authenticate', 'glance', 'cinder', 'gnocchi', 'heat',
- 'keystone', 'neutron', 'nova', 'quotas']
+ 'keystone', 'neutron', 'nova', 'quotas', 'swift']
rally_conf_path = "/etc/rally/rally.conf"
rally_aar4_patch_path = pkg_resources.resource_filename(
@@ -67,7 +68,6 @@ class RallyBase(singlevm.VmReady2):
visibility = 'public'
shared_network = True
- allow_no_fip = True
task_timeout = 3600
def __init__(self, **kwargs):
@@ -94,14 +94,12 @@ class RallyBase(singlevm.VmReady2):
self.smoke = None
self.start_time = None
self.result = None
- self.details = None
self.compute_cnt = 0
self.flavor_alt = None
self.tests = []
self.run_cmd = ''
self.network_extensions = []
self.services = []
- self.task_aborted = False
def _build_task_args(self, test_file_name):
"""Build arguments for the Rally task."""
@@ -131,7 +129,14 @@ class RallyBase(singlevm.VmReady2):
if self.network:
task_args['netid'] = str(self.network.id)
else:
- task_args['netid'] = ''
+ LOGGER.warning(
+ 'No tenant network created. '
+ 'Trying EXTERNAL_NETWORK as a fallback')
+ if env.get("EXTERNAL_NETWORK"):
+ network = self.cloud.get_network(env.get("EXTERNAL_NETWORK"))
+ task_args['netid'] = str(network.id) if network else ''
+ else:
+ task_args['netid'] = ''
return task_args
@@ -234,20 +239,17 @@ class RallyBase(singlevm.VmReady2):
rconfig.write(config_file)
@staticmethod
- def get_task_id(cmd_raw):
+ def get_task_id(tag):
"""
Get task id from command rally result.
- :param cmd_raw:
+ :param tag:
:return: task_id as string
"""
- taskid_re = re.compile('^Task +(.*): started$')
- for line in cmd_raw.splitlines(True):
- line = line.strip()
- match = taskid_re.match(line.decode("utf-8"))
- if match:
- return match.group(1)
- return None
+ cmd = ["rally", "task", "list", "--tag", tag, "--uuids-only"]
+ output = subprocess.check_output(cmd).decode("utf-8").rstrip()
+ LOGGER.info("%s: %s", " ".join(cmd), output)
+ return output
@staticmethod
def task_succeed(json_raw):
@@ -425,30 +427,22 @@ class RallyBase(singlevm.VmReady2):
else:
LOGGER.info('Test scenario: "%s" Failed.', test_name)
- def kill_task(self, proc):
- """ Kill a task."""
- proc.kill()
- self.task_aborted = True
-
def run_task(self, test_name):
"""Run a task."""
LOGGER.info('Starting test scenario "%s" ...', test_name)
LOGGER.debug('running command: %s', self.run_cmd)
- proc = subprocess.Popen(self.run_cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- self.task_aborted = False
- timer = Timer(self.task_timeout, self.kill_task, [proc])
- timer.start()
- output = proc.communicate()[0]
- if self.task_aborted:
- LOGGER.error("Failed to complete task")
- raise Exception("Failed to complete task")
- timer.cancel()
- task_id = self.get_task_id(output)
+ if six.PY3:
+ # pylint: disable=no-member
+ subprocess.call(
+ self.run_cmd, timeout=self.task_timeout,
+ stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
+ else:
+ with open(os.devnull, 'wb') as devnull:
+ subprocess.call(self.run_cmd, stdout=devnull, stderr=devnull)
+ task_id = self.get_task_id(test_name)
LOGGER.debug('task_id : %s', task_id)
- if task_id is None:
+ if not task_id:
LOGGER.error("Failed to retrieve task_id")
- LOGGER.error("Result:\n%s", output.decode("utf-8"))
raise Exception("Failed to retrieve task id")
self._save_results(test_name, task_id)
@@ -524,11 +518,11 @@ class RallyBase(singlevm.VmReady2):
shutil.copytree(task_macro, macro_dir)
self.update_keystone_default_role()
- self.compute_cnt = len(self.cloud.list_hypervisors())
+ self.compute_cnt = self.count_hypervisors()
self.network_extensions = self.cloud.get_network_extensions()
self.flavor_alt = self.create_flavor_alt()
self.services = [service.name for service in
- self.cloud.list_services()]
+ functest_utils.list_services(self.cloud)]
LOGGER.debug("flavor: %s", self.flavor_alt)
@@ -538,7 +532,8 @@ class RallyBase(singlevm.VmReady2):
if self.file_is_empty(file_name):
LOGGER.info('No tests for scenario "%s"', test_name)
return False
- self.run_cmd = (["rally", "task", "start", "--abort-on-sla-failure",
+ self.run_cmd = (["rally", "task", "start", "--tag", test_name,
+ "--abort-on-sla-failure",
"--task", self.task_file, "--task-args",
str(self._build_task_args(test_name))])
return True
@@ -605,10 +600,10 @@ class RallyBase(singlevm.VmReady2):
LOGGER.info("Rally '%s' success_rate is %s%% in %s/%s modules",
self.case_name, success_rate, nb_modules,
len(self.summary))
- payload.append({'summary': {'duration': total_duration,
- 'nb tests': total_nb_tests,
- 'nb success': success_rate}})
- self.details = payload
+ self.details['summary'] = {'duration': total_duration,
+ 'nb tests': total_nb_tests,
+ 'nb success': success_rate}
+ self.details["modules"] = payload
@staticmethod
def export_task(file_name, export_type="html"):
@@ -810,26 +805,10 @@ class RallyJobs(RallyBase):
with open(result_file_name, 'w') as fname:
template.dump(cases, fname)
- @staticmethod
- def _remove_plugins_extra():
- inst_dir = getattr(config.CONF, 'dir_rally_inst')
- try:
- shutil.rmtree(os.path.join(inst_dir, 'plugins'))
- shutil.rmtree(os.path.join(inst_dir, 'extra'))
- except Exception: # pylint: disable=broad-except
- pass
-
def prepare_task(self, test_name):
"""Prepare resources for test run."""
- self._remove_plugins_extra()
jobs_dir = os.path.join(
getattr(config.CONF, 'dir_rally_data'), test_name, 'rally-jobs')
- inst_dir = getattr(config.CONF, 'dir_rally_inst')
- shutil.copytree(os.path.join(jobs_dir, 'plugins'),
- os.path.join(inst_dir, 'plugins'))
- shutil.copytree(os.path.join(jobs_dir, 'extra'),
- os.path.join(inst_dir, 'extra'))
-
task_name = self.task_yaml.get(test_name).get("task")
task = os.path.join(jobs_dir, task_name)
if not os.path.exists(task):
@@ -840,9 +819,6 @@ class RallyJobs(RallyBase):
os.makedirs(self.temp_dir)
task_file_name = os.path.join(self.temp_dir, task_name)
self.apply_blacklist(task, task_file_name)
- self.run_cmd = (["rally", "task", "start", "--task", task_file_name])
+ self.run_cmd = (["rally", "task", "start", "--tag", test_name,
+ "--task", task_file_name])
return True
-
- def clean(self):
- self._remove_plugins_extra()
- super(RallyJobs, self).clean()