aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker/components/Dockerfile2
-rw-r--r--docker/features/testcases.yaml1
-rw-r--r--docker/features/thirdparty-requirements.txt2
-rw-r--r--docker/restapi/Dockerfile5
-rw-r--r--docker/restapi/thirdparty-requirements.txt2
-rw-r--r--docker/smoke/Dockerfile2
-rw-r--r--docs/testing/developer/devguide/index.rst8
-rw-r--r--docs/testing/user/configguide/ci.rst1
-rw-r--r--docs/testing/user/configguide/configguide.rst9
-rw-r--r--docs/testing/user/userguide/test_overview.rst34
-rw-r--r--functest/ci/check_deployment.py32
-rw-r--r--functest/ci/testcases.yaml1
-rw-r--r--functest/cli/commands/cli_os.py5
-rw-r--r--functest/opnfv_tests/openstack/rally/rally.py44
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_utils.py10
-rw-r--r--functest/tests/unit/ci/test_check_deployment.py17
-rw-r--r--functest/tests/unit/openstack/rally/test_rally.py5
17 files changed, 88 insertions, 92 deletions
diff --git a/docker/components/Dockerfile b/docker/components/Dockerfile
index 781022ef..a0f7a48e 100644
--- a/docker/components/Dockerfile
+++ b/docker/components/Dockerfile
@@ -27,7 +27,7 @@ RUN apk --no-cache add --virtual .build-deps --update \
rm -r upper-constraints.txt /src/os-faults /src/rally && \
mkdir -p /etc/rally && \
printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \
- mkdir -p /var/lib/rally/database && rally-manage db create && \
+ mkdir -p /var/lib/rally/database && rally db create && \
apk del .build-deps
COPY testcases.yaml /usr/lib/python2.7/site-packages/functest/ci/testcases.yaml
CMD ["bash","-c","prepare_env start && run_tests -t all"]
diff --git a/docker/features/testcases.yaml b/docker/features/testcases.yaml
index d29b8322..ee8e7c7c 100644
--- a/docker/features/testcases.yaml
+++ b/docker/features/testcases.yaml
@@ -27,7 +27,6 @@ tiers:
-
case_name: bgpvpn
project_name: sdnvpn
- enabled: false
criteria: 100
blocking: false
description: >-
diff --git a/docker/features/thirdparty-requirements.txt b/docker/features/thirdparty-requirements.txt
index 1acf63ea..a89fd226 100644
--- a/docker/features/thirdparty-requirements.txt
+++ b/docker/features/thirdparty-requirements.txt
@@ -1,4 +1,4 @@
# baro_tests
-# sdnvpn
+sdnvpn
sfc
# doctor-tests;python_version>='3.0'
diff --git a/docker/restapi/Dockerfile b/docker/restapi/Dockerfile
index dc0119a9..81b79fd8 100644
--- a/docker/restapi/Dockerfile
+++ b/docker/restapi/Dockerfile
@@ -44,10 +44,13 @@ RUN apk --no-cache add --update python3 sshpass \
git clone --depth 1 -b $FDS_TAG https://gerrit.opnfv.org/gerrit/fds /src/fds && \
git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test /src/vims-test && \
ln -s /src/tempest /src/refstack-client/.tempest && \
- virtualenv --system-site-packages /src/tempest/.venv && \
+ virtualenv --system-site-packages /src/tempest/.venv --python=python2.7 && \
(cd /src/vims-test && bundle config build.nokogiri --use-system-libraries && bundle install --system) && \
rm -r upper-constraints.txt thirdparty-requirements.txt /src/refstack-client/.git /src/odl_test/.git \
/src/os-faults /src/rally /src/fds/.git /src/vims-test/.git && \
+ mkdir -p /etc/rally && \
+ printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \
+ mkdir -p /var/lib/rally/database && rally db create && \
apk del .build-deps
EXPOSE 5000
CMD ["functest_restapi"]
diff --git a/docker/restapi/thirdparty-requirements.txt b/docker/restapi/thirdparty-requirements.txt
index 50e0d1c9..8eb82d77 100644
--- a/docker/restapi/thirdparty-requirements.txt
+++ b/docker/restapi/thirdparty-requirements.txt
@@ -1,4 +1,4 @@
# baro_tests
-# sdnvpn
+sdnvpn
sfc
# doctor-tests;python_version>='3.0'
diff --git a/docker/smoke/Dockerfile b/docker/smoke/Dockerfile
index 01414f3e..4485699c 100644
--- a/docker/smoke/Dockerfile
+++ b/docker/smoke/Dockerfile
@@ -36,7 +36,7 @@ RUN apk --no-cache add --virtual .build-deps --update \
rm -r upper-constraints.txt /src/refstack-client/.git /src/odl_test/.git /src/os-faults /src/rally && \
mkdir -p /etc/rally && \
printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \
- mkdir -p /var/lib/rally/database && rally-manage db create && \
+ mkdir -p /var/lib/rally/database && rally db create && \
apk del .build-deps
COPY testcases.yaml /usr/lib/python2.7/site-packages/functest/ci/testcases.yaml
CMD ["bash","-c","prepare_env start && run_tests -t all"]
diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst
index d03a10e2..12325c66 100644
--- a/docs/testing/developer/devguide/index.rst
+++ b/docs/testing/developer/devguide/index.rst
@@ -47,11 +47,6 @@ Functest High level architecture
Functest is a project delivering test containers dedicated to OPNFV.
It includes the tools, the scripts and the test scenarios.
-Until Danube, Functest produced 2 docker files based on Ubuntu 14.04:
-
- * x86 Functest: https://hub.docker.com/r/opnfv/functest/
- * aarch64 Functest: https://hub.docker.com/r/opnfv/functest_aarch64/
-
In Euphrates Alpine containers have been introduced in order to lighten the
container and manage testing slicing. The new containers are created according
to the different tiers:
@@ -95,8 +90,7 @@ The internal test cases in Euphrates are:
* vping_ssh
* vping_userdata
* odl
- * odl-netvirt
- * odl-fds
+ * odl_netvirt
* rally_full
* rally_sanity
* tempest_smoke_serial
diff --git a/docs/testing/user/configguide/ci.rst b/docs/testing/user/configguide/ci.rst
index ada803c5..f3901d86 100644
--- a/docs/testing/user/configguide/ci.rst
+++ b/docs/testing/user/configguide/ci.rst
@@ -5,7 +5,6 @@ container from Jenkins.
4 steps have been defined::
* functest-cleanup: clean existing functest dockers on the jumphost
- * set-functest-env-alpine: prepare en environement files
* functest-daily: run dockers opnfv/functest-* (healthcheck, smoke, features, vnf)
* functest-store-results: push logs to artifacts
diff --git a/docs/testing/user/configguide/configguide.rst b/docs/testing/user/configguide/configguide.rst
index b82376db..7da7285e 100644
--- a/docs/testing/user/configguide/configguide.rst
+++ b/docs/testing/user/configguide/configguide.rst
@@ -9,8 +9,6 @@ Alpine allows Functest testing in several very light containers and thanks to
the refactoring on dependency management should allow the creation of light and
fully customized docker images.
-It is still possible to use the monolithic Ubuntu image opnfv/functest especially
-for tests on Aarch64 architecture.
Functest Dockers
----------------
@@ -362,12 +360,8 @@ The structure of functest repo can be described as follows::
|-- build.sh
|-- commons
|-- docker
- | |-- Dockerfile
- | |-- Dockerfile.aarch64.patch
| |-- components
- | |-- config_install_env.sh
| |-- core
- | |-- docker_remote_api
| |-- features
| |-- healthcheck
| |-- smoke
@@ -413,7 +407,6 @@ The structure of functest repo can be described as follows::
│   |-- config_functest.yaml
│   |-- config_patch.yaml
│   |-- download_images.sh
- │   |-- installer_params.yaml
│   |-- logging.ini
│   |-- prepare_env.py
│   |-- rally_aarch64_patch.conf
@@ -735,9 +728,7 @@ work with the above pre-requisite actions.
.. _`[4]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
.. _`dockerdocs`: https://docs.docker.com/
-.. _`dockerhub`: https://hub.docker.com/r/opnfv/functest/
.. _`Proxy`: https://docs.docker.com/engine/admin/systemd/#http-proxy
-.. _`FunctestDockerTags`: https://hub.docker.com/r/opnfv/functest/tags/
.. _`Install Docker on CentOS`: https://docs.docker.com/engine/installation/linux/centos/
.. _`Functest User Guide`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/userguide/index.html
.. _`images/CentOS-7-x86_64-GenericCloud.qcow2` http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
diff --git a/docs/testing/user/userguide/test_overview.rst b/docs/testing/user/userguide/test_overview.rst
index a23df02d..98af6143 100644
--- a/docs/testing/user/userguide/test_overview.rst
+++ b/docs/testing/user/userguide/test_overview.rst
@@ -91,13 +91,6 @@ validate the scenario for the release.
| | | | integrates some test suites from |
| | | | upstream using Robot as the test |
| | | | framework |
-| | +----------------+----------------------------------+
-| | | fds | Test Suite for the OpenDaylight |
-| | | | SDN Controller when the GBP |
-| | | | features are installed. It |
-| | | | integrates some test suites from |
-| | | | upstream using Robot as the test |
-| | | | framework |
+-------------+---------------+----------------+----------------------------------+
| Features | features | bgpvpn | Implementation of the OpenStack |
| | | | bgpvpn API from the SDNVPN |
@@ -117,15 +110,6 @@ validate the scenario for the release.
| | | | See `Doctor User Guide`_ for |
| | | | details |
| | +----------------+----------------------------------+
-| | | domino | Domino provides TOSCA template |
-| | | | distribution service for network |
-| | | | service and VNF descriptors |
-| | | | among MANO components e.g., |
-| | | | NFVO, VNFM, VIM, SDN-C, etc., |
-| | | | as well as OSS/BSS functions. |
-| | | | See `Domino User Guide`_ for |
-| | | | details |
-| | +----------------+----------------------------------+
| | | odl-sfc | SFC testing for odl scenarios |
| | | | See `SFC User Guide`_ for details|
| | +----------------+----------------------------------+
@@ -139,16 +123,12 @@ validate the scenario for the release.
| | | | See `Parser User Guide`_ for |
| | | | details |
| | +----------------+----------------------------------+
-| | | promise | Resource reservation and |
-| | | | management project to identify |
-| | | | NFV related requirements and |
-| | | | realize resource reservation for |
-| | | | future usage by capacity |
-| | | | management of resource pools |
-| | | | regarding compute, network and |
-| | | | storage. |
-| | | | See `Promise User Guide`_ for |
-| | | | details |
+| | | fds | Test Suite for the OpenDaylight |
+| | | | SDN Controller when the GBP |
+| | | | features are installed. It |
+| | | | integrates some test suites from |
+| | | | upstream using Robot as the test |
+| | | | framework |
+-------------+---------------+----------------+----------------------------------+
| VNF | vnf | cloudify_ims | Example of a real VNF deployment |
| | | | to show the NFV capabilities of |
@@ -253,9 +233,7 @@ section.
.. _`[2]`: http://docs.openstack.org/developer/tempest/overview.html
.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
.. _`Doctor User Guide`: http://artifacts.opnfv.org/doctor/colorado/userguide/index.html
-.. _`Promise User Guide`: http://artifacts.opnfv.org/promise/colorado/docs/userguide/index.html
.. _`SDNVPN User Guide`: http://artifacts.opnfv.org/sdnvpn/colorado/docs/userguide/index.html
-.. _`Domino User Guide`: http://artifacts.opnfv.org/domino/docs/userguide-single/index.html
.. _`Parser User Guide`: http://artifacts.opnfv.org/parser/colorado/docs/userguide/index.html
.. _`Functest Dashboard`: http://testresults.opnfv.org/kibana_dashboards/
.. _`SFC User Guide`: http://artifacts.opnfv.org/sfc/colorado/userguide/index.html
diff --git a/functest/ci/check_deployment.py b/functest/ci/check_deployment.py
index e593e17b..db94fd74 100644
--- a/functest/ci/check_deployment.py
+++ b/functest/ci/check_deployment.py
@@ -22,6 +22,8 @@ import pkg_resources
import socket
from urlparse import urlparse
+from functest.opnfv_tests.openstack.snaps import snaps_utils
+
from snaps.openstack.utils import glance_utils
from snaps.openstack.utils import keystone_utils
from snaps.openstack.utils import neutron_utils
@@ -33,16 +35,20 @@ __author__ = "Jose Lausuch <jose.lausuch@ericsson.com>"
LOGGER = logging.getLogger(__name__)
-def verify_connectivity(adress, port):
+def verify_connectivity(endpoint):
""" Returns true if an ip/port is reachable"""
connection = socket.socket()
connection.settimeout(10)
+ ip = urlparse(endpoint).hostname
+ port = urlparse(endpoint).port
+ if not port:
+ port = 443 if urlparse(endpoint).scheme == "https" else 80
try:
- connection.connect((adress, port))
- LOGGER.debug('%s:%s is reachable!', adress, port)
+ connection.connect((ip, port))
+ LOGGER.debug('%s:%s is reachable!', ip, port)
return True
except socket.error:
- LOGGER.error('%s:%s is not reachable.', adress, port)
+ LOGGER.exception('%s:%s is not reachable.', ip, port)
return False
@@ -65,8 +71,7 @@ class CheckDeployment(object):
def check_auth_endpoint(self):
""" Verifies connectivity to the OS_AUTH_URL given in the RC file """
rc_endpoint = self.os_creds.auth_url
- if not (verify_connectivity(urlparse(rc_endpoint).hostname,
- urlparse(rc_endpoint).port)):
+ if not (verify_connectivity(rc_endpoint)):
raise Exception("OS_AUTH_URL {} is not reachable.".
format(rc_endpoint))
LOGGER.info("Connectivity to OS_AUTH_URL %s ...OK", rc_endpoint)
@@ -76,8 +81,7 @@ class CheckDeployment(object):
public_endpoint = keystone_utils.get_endpoint(self.os_creds,
'identity',
interface='public')
- if not (verify_connectivity(urlparse(public_endpoint).hostname,
- urlparse(public_endpoint).port)):
+ if not (verify_connectivity(public_endpoint)):
raise Exception("Public endpoint {} is not reachable.".
format(public_endpoint))
LOGGER.info("Connectivity to the public endpoint %s ...OK",
@@ -88,8 +92,7 @@ class CheckDeployment(object):
endpoint = keystone_utils.get_endpoint(self.os_creds,
service,
interface='public')
- if not (verify_connectivity(urlparse(endpoint).hostname,
- urlparse(endpoint).port)):
+ if not (verify_connectivity(endpoint)):
raise Exception("{} endpoint {} is not reachable.".
format(service, endpoint))
LOGGER.info("Connectivity to endpoint '%s' %s ...OK",
@@ -125,6 +128,14 @@ class CheckDeployment(object):
LOGGER.error("Glance service ...FAILED")
raise error
+ def check_ext_net(self):
+ """ checks if external network exists """
+ ext_net = snaps_utils.get_ext_net_name(self.os_creds)
+ if ext_net:
+ LOGGER.info("External network found: %s" % ext_net)
+ else:
+ raise Exception("ERROR: No external networks in the deployment.")
+
def check_all(self):
"""
Calls all the class functions and returns 0 if all of them succeed.
@@ -147,6 +158,7 @@ class CheckDeployment(object):
self.check_nova()
self.check_neutron()
self.check_glance()
+ self.check_ext_net()
return 0
diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml
index ea9f4e7b..6b1eaa9c 100644
--- a/functest/ci/testcases.yaml
+++ b/functest/ci/testcases.yaml
@@ -236,7 +236,6 @@ tiers:
-
case_name: bgpvpn
project_name: sdnvpn
- enabled: false
criteria: 100
blocking: false
description: >-
diff --git a/functest/cli/commands/cli_os.py b/functest/cli/commands/cli_os.py
index e97ab080..71cd78c5 100644
--- a/functest/cli/commands/cli_os.py
+++ b/functest/cli/commands/cli_os.py
@@ -9,6 +9,7 @@
import os
+from urlparse import urlparse
import click
@@ -27,8 +28,8 @@ class OpenStack(object):
self.openstack_creds = CONST.__getattribute__('openstack_creds')
self.snapshot_file = CONST.__getattribute__('openstack_snapshot_file')
if self.os_auth_url:
- self.endpoint_ip = self.os_auth_url.rsplit("/")[2].rsplit(":")[0]
- self.endpoint_port = self.os_auth_url.rsplit("/")[2].rsplit(":")[1]
+ self.endpoint_ip = urlparse(self.os_auth_url).hostname
+ self.endpoint_port = urlparse(self.os_auth_url).port
def ping_endpoint(self):
if self.os_auth_url is None:
diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py
index 0117e69c..0c657688 100644
--- a/functest/opnfv_tests/openstack/rally/rally.py
+++ b/functest/opnfv_tests/openstack/rally/rally.py
@@ -346,27 +346,24 @@ class RallyBase(testcase.TestCase):
LOGGER.info('No tests for scenario "%s"', test_name)
return
- cmd_line = ("rally task start --abort-on-sla-failure "
- "--task {0} "
- "--task-args \"{1}\""
- .format(task_file, self._build_task_args(test_name)))
- LOGGER.debug('running command line: %s', cmd_line)
-
- proc = subprocess.Popen(cmd_line, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT, shell=True)
+ cmd = (["rally", "task", "start", "--abort-on-sla-failure", "--task",
+ task_file, "--task-args",
+ str(self._build_task_args(test_name))])
+ LOGGER.debug('running command: %s', cmd)
+
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
output = self._get_output(proc, test_name)
task_id = self.get_task_id(output)
LOGGER.debug('task_id : %s', task_id)
if task_id is None:
LOGGER.error('Failed to retrieve task_id, validating task...')
- cmd_line = ("rally task validate "
- "--task {0} "
- "--task-args \"{1}\""
- .format(task_file, self._build_task_args(test_name)))
- LOGGER.debug('running command line: %s', cmd_line)
- proc = subprocess.Popen(cmd_line, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT, shell=True)
+ cmd = (["rally", "task", "validate", "--task", task_file,
+ "--task-args", str(self._build_task_args(test_name))])
+ LOGGER.debug('running command: %s', cmd)
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
output = self.get_cmd_output(proc)
LOGGER.error("Task validation result:" + "\n" + output)
return
@@ -380,17 +377,18 @@ class RallyBase(testcase.TestCase):
# write html report file
report_html_name = 'opnfv-{}.html'.format(test_name)
report_html_dir = os.path.join(self.RESULTS_DIR, report_html_name)
- cmd_line = "rally task report {} --out {}".format(task_id,
- report_html_dir)
+ cmd = (["rally", "task", "report", task_id, "--out", report_html_dir])
- LOGGER.debug('running command line: %s', cmd_line)
- os.popen(cmd_line)
+ LOGGER.debug('running command: %s', cmd)
+ subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
# get and save rally operation JSON result
- cmd_line = "rally task results %s" % task_id
- LOGGER.debug('running command line: %s', cmd_line)
- cmd = os.popen(cmd_line)
- json_results = cmd.read()
+ cmd = (["rally", "task", "results", task_id])
+ LOGGER.debug('running command: %s', cmd)
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ json_results = self.get_cmd_output(proc)
report_json_name = 'opnfv-{}.json'.format(test_name)
report_json_dir = os.path.join(self.RESULTS_DIR, report_json_name)
with open(report_json_dir, 'w') as r_file:
diff --git a/functest/opnfv_tests/openstack/snaps/snaps_utils.py b/functest/opnfv_tests/openstack/snaps/snaps_utils.py
index c3cd6245..284e88b5 100644
--- a/functest/opnfv_tests/openstack/snaps/snaps_utils.py
+++ b/functest/opnfv_tests/openstack/snaps/snaps_utils.py
@@ -5,17 +5,25 @@
#
# http://www.apache.org/licenses/LICENSE-2.0
+from functest.utils.constants import CONST
+
from snaps.openstack.utils import neutron_utils, nova_utils
def get_ext_net_name(os_creds):
"""
- Returns the first external network name
+ Returns the configured external network name or
+ the first retrieved external network name
:param: os_creds: an instance of snaps OSCreds object
:return:
"""
neutron = neutron_utils.neutron_client(os_creds)
ext_nets = neutron_utils.get_external_networks(neutron)
+ if (hasattr(CONST, 'EXTERNAL_NETWORK')):
+ extnet_config = CONST.__getattribute__('EXTERNAL_NETWORK')
+ for ext_net in ext_nets:
+ if ext_net.name == extnet_config:
+ return extnet_config
return ext_nets[0].name if ext_nets else ""
diff --git a/functest/tests/unit/ci/test_check_deployment.py b/functest/tests/unit/ci/test_check_deployment.py
index 1f44d078..24e3ce53 100644
--- a/functest/tests/unit/ci/test_check_deployment.py
+++ b/functest/tests/unit/ci/test_check_deployment.py
@@ -170,6 +170,23 @@ class CheckDeploymentTesting(unittest.TestCase):
self.assertRaises(Exception)
self.assertTrue(m.called)
+ @mock.patch('functest.ci.check_deployment.LOGGER.info')
+ @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
+ 'get_ext_net_name', return_value='ext-net')
+ def test_check_extnet(self, mock_getext, mock_loginfo):
+ self.deployment.check_ext_net()
+ self.assertTrue(mock_getext.called)
+ mock_loginfo.assert_called_once_with("External network found: ext-net")
+
+ @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
+ 'get_ext_net_name', return_value='')
+ def test_check_extnet_None(self, mock_getext):
+ with self.assertRaises(Exception) as context:
+ self.deployment.check_ext_net()
+ self.assertTrue(mock_getext.called)
+ msg = 'ERROR: No external networks in the deployment.'
+ self.assertTrue(msg in context)
+
if __name__ == "__main__":
logging.disable(logging.CRITICAL)
diff --git a/functest/tests/unit/openstack/rally/test_rally.py b/functest/tests/unit/openstack/rally/test_rally.py
index 83f0c86a..450eb85b 100644
--- a/functest/tests/unit/openstack/rally/test_rally.py
+++ b/functest/tests/unit/openstack/rally/test_rally.py
@@ -260,13 +260,10 @@ class OSRallyTesting(unittest.TestCase):
return_value=True)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.subprocess.Popen')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs')
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.popen')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.error')
def test_run_task_default(self, mock_logger_error, mock_logger_info,
- mock_popen, *args):
- attrs = {'read.return_value': 'json_result'}
- mock_popen.return_value.configure_mock(**attrs)
+ *args):
self.rally_base._run_task('test_name')
text = 'Test scenario: "test_name" OK.\n'
mock_logger_info.assert_any_call(text)