rally/tests/unit/test_api.py

2000 lines
88 KiB
Python

# Copyright 2013: Mirantis Inc.
# All Rights Reserved.
#
# 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
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Test for api."""
import copy
import os
import ddt
import mock
from rally import api
from rally.common import cfg
from rally.common import objects
from rally import consts
from rally import exceptions
from tests.unit import fakes
from tests.unit import test
FAKE_DEPLOYMENT_CONFIG = {
# TODO(akscram): A fake engine is more suitable for that.
"openstack": {
"auth_url": "http://example.net:5000/v2.0/",
"admin": {
"username": "admin",
"password": "myadminpass",
"tenant_name": "demo",
"domain_name": None,
"project_domain_name": "Default",
"user_domain_name": "Default",
"profiler_hmac_key": None,
"profiler_conn_str": None
},
"region_name": "RegionOne",
"endpoint_type": consts.EndpointType.INTERNAL
}
}
class APIGroupTestCase(test.TestCase):
def setUp(self):
super(APIGroupTestCase, self).setUp()
mock_api = mock.Mock()
self.apiGroup = api.APIGroup(mock_api)
@ddt.ddt
class TaskAPITestCase(test.TestCase):
def setUp(self):
super(TaskAPITestCase, self).setUp()
self.task_uuid = "b0d9cd6c-2c94-4417-a238-35c7019d0257"
self.task = {"uuid": self.task_uuid}
mock_api = mock.Mock()
mock_api.endpoint_url = None
self.task_inst = api._Task(mock_api)
@mock.patch("rally.api.task_cfg.TaskConfig")
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
@mock.patch("rally.api.engine.TaskEngine")
def test_validate(self, mock_task_engine, mock_deployment_get, mock_task,
mock_task_config):
fake_deployment = mock.Mock()
fake_env = fake_deployment.env_obj
mock_deployment_get.return_value = fake_deployment
#######################################################################
# The case #1 -- create temporary task
#######################################################################
self.task_inst.validate(deployment=fake_deployment.uuid,
config="config")
mock_task_engine.assert_called_once_with(
mock_task_config.return_value, mock_task.return_value,
fake_env),
mock_task_engine.return_value.validate.assert_called_once_with()
mock_task.assert_called_once_with(
temporary=True, env_uuid=fake_deployment.uuid)
mock_deployment_get.assert_called_once_with(fake_deployment.uuid)
self.assertFalse(mock_task.get.called)
#######################################################################
# The case #2 -- validate pre-created task
#######################################################################
mock_task_engine.reset_mock()
mock_task.reset_mock()
mock_deployment_get.reset_mock()
fake_task = fakes.FakeTask(deployment_uuid="deployment_uuid_2")
mock_task.get.return_value = fake_task
task_uuid = "task-id"
self.task_inst.validate(deployment=fake_deployment.uuid,
config="config",
task=task_uuid)
mock_task_engine.assert_called_once_with(
mock_task_config.return_value, fake_task, fake_env)
mock_task_engine.return_value.validate.assert_called_once_with()
self.assertFalse(mock_task.called)
# check that deployment uuid is taken from task
mock_deployment_get.assert_called_once_with(
fake_task["deployment_uuid"])
mock_task.get.assert_called_once_with(task_uuid)
#######################################################################
# The case #3 -- validate deprecated way for pre-created task
#######################################################################
mock_task_engine.reset_mock()
mock_task.reset_mock()
mock_deployment_get.reset_mock()
task_instance = fakes.FakeTask(uuid="task-id")
self.task_inst.validate(deployment=fake_deployment.uuid,
config="config",
task_instance=task_instance)
mock_task_engine.assert_called_once_with(
mock_task_config.return_value, fake_task, fake_env)
mock_task_engine.return_value.validate.assert_called_once_with()
self.assertFalse(mock_task.called)
# check that deployment uuid is taken from task
mock_deployment_get.assert_called_once_with(
fake_task["deployment_uuid"])
mock_task.get.assert_called_once_with(task_instance["uuid"])
#######################################################################
# The case #4 -- TaskConfig returns error
#######################################################################
mock_task_config.side_effect = Exception("Who is a good boy?! Woof.")
e = self.assertRaises(exceptions.InvalidTaskException,
self.task_inst.validate,
deployment=fake_deployment.uuid,
config="config",
task_instance=task_instance)
self.assertIn("Who is a good boy?! Woof.", "%s" % e)
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment",
return_value=fakes.FakeDeployment(uuid="deployment_uuid"))
@mock.patch("rally.api.engine.TaskEngine")
def test_validate_engine_exception(self, mock_task_engine,
mock_deployment, mock_task):
excpt = exceptions.InvalidTaskException()
mock_task_engine.return_value.validate.side_effect = excpt
self.assertRaises(exceptions.InvalidTaskException,
self.task_inst.validate,
deployment=mock_deployment.return_value["uuid"],
config="config")
def test_render_template(self):
self.assertEqual(
"3 = 3",
self.task_inst.render_template(
task_template="{{a + b}} = {{c}}", a=1, b=2, c=3))
def test_render_template_default_values(self):
template = "{% set a = a or 1 %}{{a + b}} = {{c}}"
self.assertEqual("3 = 3",
self.task_inst.render_template(
task_template=template, b=2, c=3))
self.assertEqual("5 = 5",
self.task_inst.render_template(
task_template=template, a=2, b=3, c=5))
def test_render_template_default_filter(self):
template = "{{ c | default(3) }}"
self.assertEqual("3", self.task_inst.render_template(
task_template=template))
self.assertEqual("5", self.task_inst.render_template(
task_template=template, c=5))
def test_render_template_builtin(self):
template = "{% for i in range(4) %}{{i}}{% endfor %}"
self.assertEqual("0123", self.task_inst.render_template(
task_template=template))
def test_render_template_missing_args(self):
self.assertRaises(TypeError, self.task_inst.render_template, "{{a}}")
def test_render_template_include_other_template(self):
other_template_path = os.path.join(
os.path.dirname(__file__),
"..", "..", "samples/tasks/scenarios/dummy/dummy.json")
template = "{%% include \"%s\" %%}" % os.path.basename(
other_template_path)
with open(other_template_path) as f:
other_template = f.read()
expect = self.task_inst.render_template(task_template=other_template)
actual = self.task_inst.render_template(
task_template=template,
template_dir=os.path.dirname(other_template_path))
self.assertEqual(expect, actual)
def test_render_template_min(self):
template = "{{ min(1, 2)}}"
self.assertEqual("1", self.task_inst.render_template(
task_template=template))
def test_render_template_max(self):
template = "{{ max(1, 2)}}"
self.assertEqual("2", self.task_inst.render_template(
task_template=template))
def test_render_template_ceil(self):
template = "{{ ceil(2.2)}}"
self.assertEqual("3", self.task_inst.render_template(
task_template=template))
def test_render_template_round(self):
template = "{{ round(2.2)}}"
self.assertEqual("2", self.task_inst.render_template(
task_template=template))
@mock.patch("rally.common.objects.Deployment.get")
@mock.patch("rally.common.objects.Task")
def test_create(self, mock_task, mock_deployment_get):
mock_deployment_get.return_value = {
"uuid": "b0d9cd6c-2c94-4417-a238-35c7019d0257",
"status": consts.DeployStatus.DEPLOY_FINISHED}
tags = ["a"]
self.task_inst.create(
deployment=mock_deployment_get.return_value["uuid"], tags=tags)
mock_task.assert_called_once_with(
env_uuid=mock_deployment_get.return_value["uuid"],
tags=tags)
@mock.patch("rally.common.objects.Deployment.get",
return_value={
"name": "xxx_name",
"uuid": "u_id",
"status": consts.DeployStatus.DEPLOY_INIT})
def test_create_on_unfinished_deployment(self, mock_deployment_get):
deployment_id = mock_deployment_get.return_value["uuid"]
self.assertRaises(exceptions.DeploymentNotFinishedStatus,
self.task_inst.create, deployment=deployment_id,
tags=["a"])
@mock.patch("rally.api.task_cfg.TaskConfig")
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
@mock.patch("rally.api.engine.TaskEngine")
def test_start(self, mock_task_engine, mock_deployment_get,
mock_task, mock_task_config):
fake_task = fakes.FakeTask(uuid="some_uuid")
fake_task.get_status = mock.Mock()
mock_task.return_value = fake_task
fake_deployment = fakes.FakeDeployment(
uuid="deployment_uuid", admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_FINISHED)
mock_deployment_get.return_value = fake_deployment
task_config_instance = mock_task_config.return_value
self.assertEqual(
(fake_task["uuid"], fake_task.get_status.return_value),
self.task_inst.start(
deployment=mock_deployment_get.return_value["uuid"],
config="config")
)
mock_task_engine.assert_called_once_with(
task_config_instance,
mock_task.return_value,
fake_deployment.env_obj,
abort_on_sla_failure=False
)
task_engine = mock_task_engine.return_value
task_engine.validate.assert_called_once_with()
task_engine.run.assert_called_once_with()
mock_task.assert_called_once_with(
deployment_uuid=mock_deployment_get.return_value["uuid"],
title=task_config_instance.title,
description=task_config_instance.description)
mock_deployment_get.assert_called_once_with(
mock_deployment_get.return_value["uuid"])
@mock.patch("rally.api.objects.Deployment.get")
def test_start_temporary_task(self, mock_deployment_get):
fake_deployment = fakes.FakeDeployment(
uuid="deployment_uuid", admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_FINISHED,
name="foo")
mock_deployment_get.return_value = fake_deployment
fake_task = objects.Task(task={"deployment_uuid": "deployment_uuid",
"uuid": "some_uuid"}, temporary=True)
self.assertRaises(ValueError,
self.task_inst.start,
deployment=fake_deployment,
config="config", task=fake_task)
@mock.patch("rally.api.objects.Task.get")
@mock.patch("rally.api.objects.Deployment.get")
def test_start_with_inconsistent_deployment(self, mock_deployment_get,
mock_task_get):
deployment_uuid = "deployment_uuid"
fake_deployment = fakes.FakeDeployment(
uuid=deployment_uuid, admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_INCONSISTENT,
name="foo")
mock_deployment_get.return_value = fake_deployment
fake_task_dict = {"env_uuid": deployment_uuid,
"uuid": "some_uuid"}
fake_task = objects.Task(task=fake_task_dict)
mock_task_get.return_value = fake_task
self.assertRaises(exceptions.DeploymentNotFinishedStatus,
self.task_inst.start,
deployment=deployment_uuid,
config="config",
task=fake_task["uuid"])
@mock.patch("rally.api.task_cfg.TaskConfig")
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
@mock.patch("rally.api.engine.TaskEngine")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_start_exception(self, mock_conf, mock_task_engine,
mock_deployment_get, mock_task, mock_task_config):
mock_deployment_get.return_value = fakes.FakeDeployment(
status=consts.DeployStatus.DEPLOY_FINISHED,
name="foo", uuid="deployment_uuid")
mock_task.return_value.is_temporary = False
mock_task_engine.return_value.run.side_effect = TypeError
self.assertRaises(TypeError, self.task_inst.start,
deployment="deployment_uuid", config="config")
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
@mock.patch("rally.api.engine.TaskEngine")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_start_with_wrong_config(self, mock_conf, mock_task_engine,
mock_deployment_get, mock_task):
mock_deployment_get.return_value = {
"status": consts.DeployStatus.DEPLOY_FINISHED}
self.assertRaises(exceptions.InvalidTaskException,
self.task_inst.start,
deployment="deployment_uuid", config="config")
@ddt.data(True, False)
@mock.patch("rally.api.time")
@mock.patch("rally.api.objects.Task")
def test_abort_with_waiting(self, soft, mock_task, mock_time):
mock_task.get_status.side_effect = (
consts.TaskStatus.INIT,
consts.TaskStatus.VALIDATING,
consts.TaskStatus.RUNNING,
consts.TaskStatus.ABORTING,
consts.TaskStatus.SOFT_ABORTING,
consts.TaskStatus.ABORTED)
some_uuid = "ca441749-0eb9-4fcc-b2f6-76d314c55404"
self.task_inst.abort(task_uuid=some_uuid, soft=soft, wait=True)
mock_task.get.assert_called_once_with(some_uuid)
mock_task.get.return_value.abort.assert_called_once_with(soft=soft)
self.assertEqual([mock.call(some_uuid)] * 6,
mock_task.get_status.call_args_list)
self.assertTrue(mock_time.sleep.called)
@ddt.data(True, False)
@mock.patch("rally.api.time")
@mock.patch("rally.api.objects.Task")
def test_abort_without_waiting(self, soft, mock_task, mock_time):
some_uuid = "133695fb-400d-4988-859c-30bfaa0488ce"
self.task_inst.abort(task_uuid=some_uuid, soft=soft, wait=False)
mock_task.get.assert_called_once_with(some_uuid)
mock_task.get.return_value.abort.assert_called_once_with(soft=soft)
self.assertFalse(mock_task.get_status.called)
self.assertFalse(mock_time.sleep.called)
@mock.patch("rally.api.LOG")
@mock.patch("rally.api.time")
@mock.patch("rally.api.objects.Task")
def test_abort_using_deprecated_async_argument(self, mock_task, mock_time,
mock_log):
kwargs = {"async": True}
self.task_inst.abort(task_uuid="133695fb-400d-4988-859c-30bfaa0488ce",
**kwargs)
self.assertTrue(mock_log.warning.called)
@ddt.data({"task_status": "strange value",
"expected_status": consts.TaskStatus.FINISHED},
{"task_status": consts.TaskStatus.INIT,
"expected_status": consts.TaskStatus.FINISHED},
{"task_status": consts.TaskStatus.VALIDATING,
"expected_status": consts.TaskStatus.FINISHED},
{"task_status": consts.TaskStatus.ABORTING,
"expected_status": consts.TaskStatus.FINISHED},
{"task_status": consts.TaskStatus.SOFT_ABORTING,
"expected_status": consts.TaskStatus.FINISHED},
{"task_status": consts.TaskStatus.RUNNING,
"expected_status": consts.TaskStatus.FINISHED},
{"task_status": consts.TaskStatus.ABORTED,
"expected_status": None},
{"task_status": consts.TaskStatus.FINISHED,
"expected_status": None},
{"task_status": consts.TaskStatus.CRASHED,
"expected_status": None},
{"task_status": "strange value",
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.INIT,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.VALIDATING,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.RUNNING,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.ABORTING,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.SOFT_ABORTING,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.ABORTED,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.FINISHED,
"force": True, "expected_status": None},
{"task_status": consts.TaskStatus.CRASHED,
"force": True, "expected_status": None})
@ddt.unpack
@mock.patch("rally.api.objects.Task.get_status")
@mock.patch("rally.api.objects.Task.delete_by_uuid")
def test_delete(self, mock_task_delete_by_uuid, mock_task_get_status,
task_status, expected_status, force=False, raises=None):
mock_task_get_status.return_value = task_status
self.task_inst.delete(task_uuid=self.task_uuid, force=force)
if force:
self.assertFalse(mock_task_get_status.called)
else:
mock_task_get_status.assert_called_once_with(self.task_uuid)
mock_task_delete_by_uuid.assert_called_once_with(
self.task_uuid,
status=expected_status)
@mock.patch("rally.api.texporter.TaskExporter")
@mock.patch("rally.api.objects.Task.get")
def test_export(self, mock_task_get, mock_task_exporter):
tasks_id = ["uuid-1", "uuid-2"]
tasks = [mock.Mock(), mock.Mock()]
tasks[0].to_dict.return_value = {"uuid": "uuid-1"}
tasks[1].to_dict.return_value = {"uuid": "uuid-2"}
mock_task_get.side_effect = tasks
output_type = mock.Mock()
output_dest = mock.Mock()
reporter = mock_task_exporter.get.return_value
mock_task_exporter.validate.return_value = None
self.assertEqual(mock_task_exporter.make.return_value,
self.task_inst.export(
tasks=tasks_id + [{"uuid": "uuid-3"}],
output_type=output_type,
output_dest=output_dest))
mock_task_exporter.get.assert_called_once_with(output_type)
mock_task_exporter.validate.assert_called_once_with(
output_type, context={}, config={},
plugin_cfg={"destination": output_dest},
vtype="syntax")
mock_task_exporter.make.assert_called_once_with(
reporter,
[t.to_dict.return_value for t in tasks] + [{"uuid": "uuid-3"}],
output_dest, api=self.task_inst.api)
self.assertEqual([mock.call(u, detailed=True) for u in tasks_id],
mock_task_get.call_args_list)
@mock.patch("rally.api.objects.Task")
def test_get_detailed(self, mock_task):
mock_task.get.return_value = mock.Mock()
task = mock_task.get.return_value
self.assertEqual(
task.to_dict.return_value,
self.task_inst.get(task_id="task_uuid", detailed=True))
mock_task.get.assert_called_once_with("task_uuid", detailed=True)
self.assertFalse(task.extend_results.called)
task.to_dict.assert_called_once_with()
@mock.patch("rally.api.objects.Task")
def test_list(self, mock_task):
task = mock.Mock()
task.to_dict.return_value = self.task
mock_task.list.return_value = [task]
tasks = self.task_inst.list()
self.assertEqual([self.task], tasks)
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
def test_import_results(self, mock_deployment_get, mock_task):
mock_deployment_get.return_value = fakes.FakeDeployment(
uuid="deployment_uuid", admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_FINISHED)
workload = {"name": "test_scenario",
"description": "scen-description",
"full_duration": 3,
"load_duration": 1,
"start_time": 23.77,
"position": 77,
"runner": {},
"runner_type": "",
"contexts": {},
"contexts_results": [],
"hooks": [],
"pass_sla": True,
"sla": {},
"sla_results": {"sla": [{"success": True}]},
"args": {},
"statistics": {},
"total_iteration_count": 3,
"failed_iteration_count": 0,
"data": ["data-raw"]}
task_results = {"subtasks": [
{"title": "subtask-title",
"workloads": [workload]}]}
self.assertEqual(
mock_task.return_value.to_dict(),
self.task_inst.import_results(
deployment=mock_deployment_get.return_value["uuid"],
task_results=task_results)
)
mock_task.assert_called_once_with(env_uuid="deployment_uuid",
tags=None)
mock_task.return_value.update_status.assert_has_calls(
[mock.call(consts.TaskStatus.RUNNING),
mock.call(consts.SubtaskStatus.FINISHED)]
)
mock_task.return_value.add_subtask.assert_called_once_with(
title="subtask-title")
sub_task = mock_task.return_value.add_subtask.return_value
sub_task.add_workload.assert_called_once_with(
name=workload["name"],
description=workload["description"],
position=workload["position"], runner=workload["runner"],
runner_type=workload["runner_type"],
contexts=workload["contexts"],
sla=workload["sla"],
hooks=workload["hooks"], args=workload["args"]
)
sub_task.update_status.assert_called_once_with(
consts.SubtaskStatus.FINISHED)
work_load = sub_task.add_workload.return_value
work_load.add_workload_data.assert_called_once_with(
0, {"raw": workload["data"]})
work_load.set_results.assert_called_once_with(
full_duration=workload["full_duration"],
load_duration=workload["load_duration"],
sla_results=workload["sla_results"]["sla"],
contexts_results=workload["contexts_results"],
hooks_results=workload["hooks"], start_time=workload["start_time"])
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
@mock.patch("rally.api.CONF")
def test_import_results_chunk_size(self, mock_conf,
mock_deployment_get,
mock_task):
mock_deployment_get.return_value = fakes.FakeDeployment(
uuid="deployment_uuid", admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_FINISHED)
workload = {"name": "test_scenario",
"description": "scen-description",
"full_duration": 3,
"load_duration": 1,
"start_time": 23.77,
"position": 77,
"runner": {},
"runner_type": "",
"contexts": {"foo": {"killall": False}},
"contexts_results": [],
"hooks": [],
"pass_sla": True,
"sla": {},
"sla_results": {"sla": [{"success": True}]},
"args": {},
"statistics": {},
"total_iteration_count": 3,
"failed_iteration_count": 0,
"data": [{"timestamp": 1},
{"timestamp": 2},
{"timestamp": 3}]}
task_results = {"subtasks": [{"title": "scen-subtasks",
"workloads": [workload]}]}
mock_conf.raw_result_chunk_size = 2
self.assertEqual(
mock_task.return_value.to_dict(),
self.task_inst.import_results(
deployment=mock_deployment_get.return_value["uuid"],
task_results=task_results)
)
mock_task.assert_called_once_with(env_uuid="deployment_uuid",
tags=None)
mock_task.return_value.update_status.assert_has_calls(
[mock.call(consts.TaskStatus.RUNNING),
mock.call(consts.SubtaskStatus.FINISHED)]
)
mock_task.return_value.add_subtask.assert_called_once_with(
title=task_results["subtasks"][0]["title"])
sub_task = mock_task.return_value.add_subtask.return_value
sub_task.add_workload.assert_called_once_with(
name=workload["name"],
description=workload["description"],
position=workload["position"],
runner=workload["runner"],
runner_type=workload["runner_type"],
contexts=workload["contexts"],
sla=workload["sla"],
hooks=workload["hooks"],
args=workload["args"]
)
sub_task.update_status.assert_called_once_with(
consts.SubtaskStatus.FINISHED)
work_load = sub_task.add_workload.return_value
self.assertEqual(
[mock.call(0, {"raw": [{"timestamp": 1}, {"timestamp": 2}]}),
mock.call(1, {"raw": [{"timestamp": 3}]})],
work_load.add_workload_data.call_args_list)
work_load.set_results.assert_called_once_with(
full_duration=workload["full_duration"],
load_duration=workload["load_duration"],
sla_results=workload["sla_results"]["sla"],
contexts_results=workload["contexts_results"],
hooks_results=workload["hooks"], start_time=workload["start_time"])
@mock.patch("rally.api.objects.Deployment.get")
def test_import_results_with_inconsistent_deployment(
self, mock_deployment_get):
fake_deployment = fakes.FakeDeployment(
uuid="deployment_uuid", admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_INCONSISTENT,
name="foo")
mock_deployment_get.return_value = fake_deployment
self.assertRaises(exceptions.DeploymentNotFinishedStatus,
self.task_inst.import_results,
deployment="deployment_uuid",
task_results={},
tags=["tag"])
@mock.patch("rally.api.objects.Task")
@mock.patch("rally.api.objects.Deployment.get")
def test_import_results_with_error_data(
self, mock_deployment_get, mock_task):
mock_deployment_get.return_value = fakes.FakeDeployment(
uuid="deployment_uuid", admin="fake_admin", users=["fake_user"],
status=consts.DeployStatus.DEPLOY_FINISHED)
mock_task.return_value.result_has_valid_schema = mock.MagicMock(
return_value=False)
task_results = {"subtasks": [{"title": "subtask-title",
"workloads": [{"data": [{"a": 1}]}]
}]}
self.assertRaises(exceptions.RallyException,
self.task_inst.import_results,
deployment="deployment_uuid",
task_results=task_results)
class BaseDeploymentTestCase(test.TestCase):
def setUp(self):
super(BaseDeploymentTestCase, self).setUp()
mock_api = mock.Mock()
mock_api.endpoint_url = None
self.deployment_inst = api._Deployment(mock_api)
self.deployment_config = copy.deepcopy(FAKE_DEPLOYMENT_CONFIG)
self.deployment_uuid = "599bdf1d-fe77-461a-a810-d59b1490f4e3"
admin_credential = copy.deepcopy(self.deployment_config["openstack"])
admin_credential["endpoint"] = None
admin_credential.update(admin_credential.pop("admin"))
admin_credential["permission"] = consts.EndpointPermission.ADMIN
admin_credential["https_insecure"] = False
admin_credential["https_cacert"] = None
self.credentials = {"admin": admin_credential, "users": []}
self.deployment = {
"uuid": self.deployment_uuid,
"name": "fake_name",
"config": self.deployment_config,
"credentials": {"openstack": [self.credentials]}
}
class DeploymentAPITestCase(BaseDeploymentTestCase):
@mock.patch("rally.api.objects.Deployment")
def test_create(self, mock_deployment):
dep = self.deployment_inst.create(config=self.deployment_config,
name="fake_deployment")
self.assertEqual(mock_deployment.return_value.to_dict.return_value,
dep)
mock_deployment.assert_called_once_with(
name="fake_deployment",
config=self.deployment_config,
extras={})
@mock.patch("rally.api.objects.Deployment")
def test_create_duplicate(self, mock_deployment):
exc = exceptions.DBRecordExists(
field="name", value="fake_deployment", table="envs")
mock_deployment.side_effect = exc
a_exc = self.assertRaises(
exceptions.DBRecordExists,
self.deployment_inst.create, config=self.deployment_config,
name="fake_deployment")
self.assertEqual(exc, a_exc)
@mock.patch("rally.api.objects.Deployment")
def test_create_with_old_cfg(self, mock_deployment):
mock_deployment.return_value.env_obj.spec = ""
config = {"type": "ExistingCloud",
"creds": self.deployment_config}
dep = self.deployment_inst.create(config=config,
name="fake_deployment")
self.assertEqual(mock_deployment.return_value.to_dict.return_value,
dep)
mock_deployment.assert_called_once_with(
name="fake_deployment",
config=self.deployment_config,
extras={})
config = {"type": "Something",
"creds": self.deployment_config}
e = self.assertRaises(
exceptions.RallyException,
self.deployment_inst.create, config=config,
name="fake_deployment")
self.assertIn("You are using deployment type which doesn't exist.",
"%s" % e)
@mock.patch("rally.common.objects.deploy.env_mgr.EnvManager.get")
def test_destroy(self, mock_env_manager_get):
list_verifiers = [{"name": "f1", "uuid": "1"},
{"name": "f2", "uuid": "2"}]
self.deployment_inst.api.verifier.list.return_value = list_verifiers
self.deployment_inst.destroy(deployment=self.deployment_uuid)
mock_env_manager_get.assert_called_once_with(self.deployment_uuid)
mock_env_manager_get.return_value.destroy.assert_called_once_with(
skip_cleanup=True
)
def test_recreate(self):
e = self.assertRaises(exceptions.RallyException,
self.deployment_inst.recreate, deployment="")
self.assertIn("Sorry, but recreate method", "%s" % e)
@mock.patch("rally.common.objects.deploy.env_mgr.EnvManager.get")
def test_get(self, mock_env_manager_get):
origin_config = copy.deepcopy(self.deployment_config)
mock_env_manager_get.return_value.data = {
"spec": self.deployment_config,
"platforms": {},
"id": self.id(),
"uuid": self.deployment["uuid"],
"extras": {},
"name": self.deployment["name"],
"created_at": mock.Mock(),
"updated_at": mock.Mock()}
ret = self.deployment_inst.get(deployment=self.deployment["uuid"])
for key in self.deployment:
self.assertIn(key, ret)
if key not in ("credentials", "config"):
self.assertEqual(self.deployment[key], ret[key],
"The key '%s' differs." % key)
self.assertEqual(origin_config, ret["config"])
@mock.patch("rally.common.objects.Deployment.list")
def test_list(self, mock_deployment_list):
mock_deployment = mock.Mock()
mock_deployment.to_dict.return_value = self.deployment
mock_deployment_list.return_value = [mock_deployment]
ret = self.deployment_inst.list()
for key in self.deployment:
self.assertEqual(ret[0][key], self.deployment[key])
@mock.patch("rally.common.objects.Deployment.get")
def test_deployment_check(self, mock_deployment_get):
env = mock_deployment_get.return_value.env_obj
env.check_health.return_value = {
"foo": {"available": True}
}
self.assertEqual(
{"foo": [{"services": []}]},
self.deployment_inst.check(deployment="uuid"))
env.check_health.assert_called_once_with()
self.assertFalse(env.get_info.called)
@mock.patch("rally.common.objects.Deployment.get")
def test_deployment_check_list_services(self, mock_deployment_get):
env = mock_deployment_get.return_value.env_obj
env.get_info.return_value = {
"existing@openstack": {"info": {
"services": [{"type": "foo", "name": "bar"},
{"type": "volumev4"}]}}
}
env.check_health.return_value = {
"existing@openstack": {"available": True}
}
self.assertEqual(
{"openstack": [{
"services": [{"type": "foo", "name": "bar"},
{"type": "volumev4", "name": "__unknown__"}]}]},
self.deployment_inst.check(deployment="uuid"))
env.check_health.assert_called_once_with()
env.get_info.assert_called_once_with()
@mock.patch("rally.common.objects.Deployment.get")
def test_deployment_check_fails(self, mock_deployment_get):
env = mock_deployment_get.return_value.env_obj
env.get_info.return_value = {
"existing@openstack": {"info": {"services": [{"foo": "bar"}]}}
}
trace1 = ("Traceback (most recent call last):\n"
" File '<ipython-input-3-e551aac575a4>', line 2, in "
"<module>\n"
" raise Exception('asd: asd :asd asd ')\n"
"Exception: asd: asd :asd asd \n")
msg1 = "Bad user creds: oops"
trace2 = ("Traceback (most recent call last):\n"
" File '<ipython-input-3-e551aac575a4>', line 2, in "
"<module>\n"
" raise KeyError('asd: asd :asd asd2 ')\n"
"KeyError: asd: asd :asd asd2 \n")
msg2 = "Ooops"
env.check_health.return_value = {
"existing@openstack": {
"available": False,
"message": msg1,
"traceback": trace1},
"foo@bar": {
"available": False,
"message": msg2,
"traceback": trace2
}
}
self.assertEqual(
{
"openstack": [{
"services": [],
"user_error": {"etype": "Exception",
"msg": msg1,
"trace": trace1}}],
"foo@bar": [{
"services": [],
"admin_error": {"etype": "KeyError",
"msg": msg2,
"trace": trace2}}]},
self.deployment_inst.check(deployment="uuid"))
env.check_health.assert_called_once_with()
self.assertFalse(env.get_info.called)
class APITestCase(test.TestCase):
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.version.database_revision",
return_value={"revision": "foobar", "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_config_args(self, mock_conf, mock_version_string,
mock_database_revision, mock_isfile):
api_ = api.API(config_args=["foo", "bar", "baz"])
mock_conf.assert_called_once_with(
["foo", "bar", "baz"], default_config_files=None,
project="rally", version="0.0.0")
self.assertIsInstance(api_._deployment, api._Deployment)
self.assertIsInstance(api_._task, api._Task)
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.version.database_revision",
return_value={"revision": "foobar", "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_config_file(self, mock_conf, mock_version_string,
mock_database_revision, mock_isfile):
api_ = api.API(config_file="myfile.conf")
mock_conf.assert_called_once_with(
[], default_config_files=["myfile.conf"],
project="rally", version="0.0.0")
self.assertIsInstance(api_._deployment, api._Deployment)
self.assertIsInstance(api_._task, api._Task)
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.version.database_revision",
return_value={"revision": "foobar", "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_no_default_config_file(self, mock_conf, mock_version_string,
mock_database_revision, mock_isfile):
api.API(skip_db_check=True)
mock_conf.assert_called_once_with(
[], default_config_files=None, project="rally", version="0.0.0")
@mock.patch("os.path.isfile")
@mock.patch("rally.common.version.database_revision",
return_value={"revision": "foobar", "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_default_config_file(self, mock_conf, mock_version_string,
mock_database_revision, mock_isfile):
mock_isfile.side_effect = lambda f: f == "/etc/rally/rally.conf"
api.API(skip_db_check=True)
mock_conf.assert_called_once_with(
[], default_config_files=["/etc/rally/rally.conf"],
project="rally", version="0.0.0")
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_exception(self, mock_conf, mock_version_string, mock_isfile):
mock_conf.side_effect = cfg.ConfigFilesNotFoundError(["file1",
"file2"])
self.assertRaises(exceptions.RallyException, api.API)
mock_conf.assert_called_once_with(
[], default_config_files=None, project="rally", version="0.0.0")
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.plugin.discover.load_plugins")
@mock.patch("rally.common.version.database_revision",
return_value={"revision": "foobar", "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_plugin_path(self, mock_conf, mock_version_string,
mock_database_revision, mock_load_plugins,
mock_isfile):
mock_conf.__contains__.return_value = True
mock_conf.get.side_effect = (
lambda a: ["/path/from/args"] if a == "plugin_paths" else None)
api.API(plugin_paths=["/my/path"])
mock_conf.assert_called_once_with([], default_config_files=None,
project="rally", version="0.0.0")
mock_load_plugins.assert_has_calls([
mock.call("/my/path"),
mock.call("/path/from/args"),
])
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.version.database_revision",
return_value={"revision": "spam", "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_check_revision_exception(self, mock_conf,
mock_version_string,
mock_database_revision,
mock_isfile):
exc = self.assertRaises(exceptions.RallyException, api.API)
self.assertIn("rally db upgrade", str(exc))
mock_conf.assert_called_once_with(
[], default_config_files=None, project="rally", version="0.0.0")
@mock.patch("os.path.isfile", return_value=False)
@mock.patch("rally.common.version.database_revision",
return_value={"revision": None, "current_head": "foobar"})
@mock.patch("rally.common.version.version_string", return_value="0.0.0")
@mock.patch("rally.api.CONF", spec=cfg.CONF)
def test_init_check_revision_exception_no_db(self, mock_conf,
mock_version_string,
mock_database_revision,
mock_isfile):
exc = self.assertRaises(exceptions.RallyException, api.API)
self.assertIn("rally db create", str(exc))
mock_conf.assert_called_once_with(
[], default_config_files=None, project="rally", version="0.0.0")
def test_version(self):
api_inst = api.API(skip_db_check=True)
self.assertEqual(1, api_inst.version)
@mock.patch("requests.request")
def test__request(self, mock_request):
api_inst = api.API(skip_db_check=True)
method = "test"
path = "path"
response = mock_request.return_value
response.status_code = 200
response.json.return_value = {"result": "test"}
self.assertEqual("test", api_inst._request(path=path, method=method))
@mock.patch("requests.request")
@mock.patch("rally.exceptions.find_exception")
def test__request_fail(self, mock_find_exception, mock_request):
api_inst = api.API(skip_db_check=True)
method = "test"
path = "path"
response = mock_request.return_value
mock_find_exception.return_value = exceptions.RallyException()
response.status_code = 201
response.json.return_value = {"result": "test"}
self.assertRaises(exceptions.RallyException,
api_inst._request, path=path, method=method)
class FakeVerifierManager(object):
NAME = "fake_verifier"
PLATFORM = "tests"
TITLE = "Fake verifier which is used only for testing purpose"
@classmethod
def get_name(cls):
return cls.NAME
@classmethod
def get_platform(cls):
return cls.PLATFORM
@classmethod
def get_info(cls):
return {"title": cls.TITLE}
class VerifierAPITestCase(test.TestCase):
def setUp(self):
super(VerifierAPITestCase, self).setUp()
mock_api = mock.Mock()
mock_api.endpoint_url = None
self.verifier_inst = api._Verifier(mock_api)
@mock.patch("rally.api.vmanager.VerifierManager.get_all")
def test_list_plugins(self, mock_verifier_manager_get_all):
platform = "some"
mock_verifier_manager_get_all.return_value = [FakeVerifierManager]
self.assertEqual(
[{"name": FakeVerifierManager.NAME,
"platform": FakeVerifierManager.PLATFORM,
"description": FakeVerifierManager.TITLE,
"location": "%s.%s" % (FakeVerifierManager.__module__,
FakeVerifierManager.__name__)}],
self.verifier_inst.list_plugins(platform=platform))
mock_verifier_manager_get_all.assert_called_once_with(
platform=platform)
@mock.patch("rally.api.objects.Verifier.get")
def test_get(self, mock_verifier_get):
uuid = "some"
self.assertEqual(mock_verifier_get.return_value.to_dict(),
self.verifier_inst.get(verifier_id=uuid))
mock_verifier_get.assert_called_once_with(uuid)
@mock.patch("rally.api.objects.Verifier.list")
def test_list(self, mock_verifier_list):
status = "some_special_status"
mock_verifier_list.return_value = [mock.Mock()]
self.assertEqual(
[i.to_dict() for i in mock_verifier_list.return_value],
self.verifier_inst.list(status=status))
mock_verifier_list.assert_called_once_with(status)
@mock.patch("rally.api.objects.Verifier.create")
@mock.patch("rally.api._Verifier._get")
@mock.patch("rally.api.vmanager.VerifierManager.get")
def test_create(self, mock_verifier_manager_get, mock___verifier__get,
mock_verifier_create):
mock___verifier__get.side_effect = exceptions.DBRecordNotFound(
criteria="uuid: 1", table="verifiers")
name = "SomeVerifier"
vtype = "fake_verifier"
platform = "tests"
source = "https://example.com"
version = "3.1415"
system_wide = True
extra_settings = {"verifier_specific_option": "value_for_it"}
verifier_obj = mock_verifier_create.return_value
verifier_obj.manager.get_platform.return_value = platform
verifier_obj.manager._meta_get.side_effect = [source]
verifier_uuid = self.verifier_inst.create(
name=name, vtype=vtype, version=version,
system_wide=system_wide, extra_settings=extra_settings)
mock_verifier_manager_get.assert_called_once_with(vtype,
platform=None)
mock___verifier__get.assert_called_once_with(name)
mock_verifier_create.assert_called_once_with(
name=name, source=None, system_wide=system_wide, version=version,
vtype=vtype, platform=None, extra_settings=extra_settings)
self.assertEqual(verifier_obj.uuid, verifier_uuid)
verifier_obj.update_properties.assert_called_once_with(
platform=platform, source=source)
self.assertEqual([mock.call(consts.VerifierStatus.INSTALLING),
mock.call(consts.VerifierStatus.INSTALLED)],
verifier_obj.update_status.call_args_list)
verifier_obj.manager.install.assert_called_once_with()
@mock.patch("rally.api.objects.Verifier.create")
@mock.patch("rally.api._Verifier._get")
@mock.patch("rally.api.vmanager.VerifierManager.get")
def test_create_fails_on_existing_verifier(
self, mock_verifier_manager_get, mock___verifier__get,
mock_verifier_create):
name = "SomeVerifier"
vtype = "fake_verifier"
platform = "tests"
source = "https://example.com"
version = "3.1415"
system_wide = True
extra_settings = {"verifier_specific_option": "value_for_it"}
self.assertRaises(exceptions.RallyException,
self.verifier_inst.create,
name=name, vtype=vtype, platform=platform,
source=source, version=version,
system_wide=system_wide,
extra_settings=extra_settings)
mock_verifier_manager_get.assert_called_once_with(vtype,
platform=platform)
mock___verifier__get.assert_called_once_with(name)
self.assertFalse(mock_verifier_create.called)
@mock.patch("rally.api.objects.Verifier.create")
@mock.patch("rally.api._Verifier._get")
@mock.patch("rally.api.vmanager.VerifierManager.get")
def test_create_fails_on_install_step(
self, mock_verifier_manager_get, mock___verifier__get,
mock_verifier_create):
mock___verifier__get.side_effect = exceptions.DBRecordNotFound(
criteria="id: 1", table="verifiers")
verifier_obj = mock_verifier_create.return_value
verifier_obj.manager.install.side_effect = RuntimeError
name = "SomeVerifier"
vtype = "fake_verifier"
platform = "tests"
source = "https://example.com"
version = "3.1415"
system_wide = True
extra_settings = {"verifier_specific_option": "value_for_it"}
self.assertRaises(RuntimeError,
self.verifier_inst.create,
name=name, vtype=vtype, platform=platform,
source=source, version=version,
system_wide=system_wide,
extra_settings=extra_settings)
mock_verifier_manager_get.assert_called_once_with(
vtype, platform=platform)
mock___verifier__get.assert_called_once_with(name)
mock_verifier_create.assert_called_once_with(
name=name, source=source, system_wide=system_wide, version=version,
vtype=vtype, platform=platform, extra_settings=extra_settings)
self.assertEqual([mock.call(consts.VerifierStatus.INSTALLING),
mock.call(consts.VerifierStatus.FAILED)],
verifier_obj.update_status.call_args_list)
verifier_obj.manager.install.assert_called_once_with()
@mock.patch("rally.api.objects.Verifier.delete")
@mock.patch("rally.common.objects.Verifier.get")
def test_delete_no_verifications(self, mock_verifier_get,
mock_verifier_delete):
self.verifier_inst.api.verification.list
self.verifier_inst.api.verification.list.return_value = []
verifier_obj = mock_verifier_get.return_value
verifier_id = "uuuiiiddd"
deployment_id = "deployment"
# remove just deployment specific data
self.verifier_inst.delete(verifier_id=verifier_id,
deployment_id=deployment_id)
self.assertFalse(mock_verifier_delete.called)
self.verifier_inst.api.verification.list.assert_called_once_with(
verifier_id=verifier_id, deployment_id=deployment_id)
verifier_obj.set_env.assert_called_once_with(deployment_id)
verifier_obj.manager.uninstall.assert_called_once_with()
verifier_obj.set_env.reset_mock()
verifier_obj.manager.uninstall.reset_mock()
self.verifier_inst.api.verification.list.reset_mock()
# remove the whole verifier
self.verifier_inst.delete(verifier_id=verifier_id)
self.verifier_inst.api.verification.list.assert_called_once_with(
verifier_id=verifier_id, deployment_id=None)
self.assertFalse(verifier_obj.set_env.called)
verifier_obj.manager.uninstall.assert_called_once_with(full=True)
mock_verifier_delete.assert_called_once_with(verifier_id)
@mock.patch("rally.common.objects.Verifier.get")
@mock.patch("rally.api.objects.Verifier.delete")
def test_delete_with_verifications(self,
mock_verifier_delete,
mock_verifier_get):
verifications = [{"uuid": "uuid_1"}, {"uuid": "uuid_2"}]
verifier_id = "uuuiiiddd"
self.assertRaises(exceptions.RallyException,
self.verifier_inst.delete,
verifier_id=verifier_id)
self.verifier_inst.api.verification.list.assert_called_once_with(
verifier_id=verifier_id, deployment_id=None)
self.assertFalse(self.verifier_inst.api.verification.delete.called)
self.verifier_inst.api.reset_mock()
self.verifier_inst.api.verification.list.return_value = verifications
self.verifier_inst.delete(verifier_id=verifier_id, force=True)
self.verifier_inst.api.verification.list.assert_called_once_with(
verifier_id=verifier_id, deployment_id=None)
self.assertEqual(
[mock.call(verification_uuid=v["uuid"]) for v in verifications],
self.verifier_inst.api.verification.delete.call_args_list)
@mock.patch("rally.api.utils.BackupHelper")
@mock.patch("rally.api._Verifier._get")
def test_update_failed(self, mock___verifier__get, mock_backup_helper):
verifier_obj = mock___verifier__get.return_value
verifier_obj.system_wide = False
uuid = "uuuuiiiidddd"
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.update,
verifier_id=uuid)
self.assertIn("At least one of the following parameters should be",
"%s" % e)
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.update,
verifier_id=uuid, system_wide=True)
self.assertIn("because verifier is in '%s' status" % status,
"%s" % e)
verifier_obj.status = consts.VerifierStatus.INSTALLED
msg = "It is impossible to update the virtual environment for verifier"
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.update,
verifier_id=uuid,
system_wide=True,
update_venv=True)
self.assertIn(msg, "%s" % e)
verifier_obj.system_wide = True
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.update,
verifier_id=uuid, update_venv=True)
self.assertIn(msg, "%s" % e)
@mock.patch("rally.api.utils.BackupHelper")
@mock.patch("rally.api._Verifier._get")
def test_update(self, mock___verifier__get, mock_backup_helper):
verifier_obj = mock___verifier__get.return_value
verifier_obj.system_wide = False
verifier_obj.status = consts.VerifierStatus.INSTALLED
uuid = "uuuuiiiidddd"
version = "3.1415"
# check updating just version
self.verifier_inst.update(verifier_id=uuid, version=version)
verifier_obj.manager.checkout.assert_called_once_with(version)
self.assertFalse(verifier_obj.manager.check_system_wide.called)
verifier_obj.update_properties.assert_called_once_with(
status=verifier_obj.status, version=version)
verifier_obj.update_status.assert_called_once_with(
consts.VerifierStatus.UPDATING)
self.assertFalse(verifier_obj.manager.install_venv.called)
verifier_obj.manager.checkout.reset_mock()
verifier_obj.manager.check_system_wide.reset_mock()
verifier_obj.update_properties.reset_mock()
verifier_obj.update_status.reset_mock()
# check system_wide
self.verifier_inst.update(verifier_id=uuid,
version=version, system_wide=True)
verifier_obj.manager.checkout.assert_called_once_with(version)
verifier_obj.manager.check_system_wide.assert_called_once_with()
verifier_obj.update_properties.assert_called_once_with(
status=verifier_obj.status, version=version, system_wide=True)
verifier_obj.update_status.assert_called_once_with(
consts.VerifierStatus.UPDATING)
self.assertFalse(verifier_obj.manager.install_venv.called)
verifier_obj.manager.checkout.reset_mock()
verifier_obj.manager.check_system_wide.reset_mock()
verifier_obj.update_properties.reset_mock()
verifier_obj.update_status.reset_mock()
# check switching from system-wide to virtual environment
verifier_obj.system_wide = True
self.verifier_inst.update(verifier_id=uuid, system_wide=False)
verifier_obj.manager.install_venv.assert_called_once_with()
self.assertFalse(verifier_obj.manager.check_system_wide.called)
verifier_obj.update_status.assert_called_once_with(
consts.VerifierStatus.UPDATING)
verifier_obj.update_properties.assert_called_once_with(
status=verifier_obj.status, system_wide=False)
verifier_obj.manager.check_system_wide.reset_mock()
verifier_obj.update_properties.reset_mock()
verifier_obj.update_status.reset_mock()
verifier_obj.manager.install_venv.reset_mock()
# check updating virtual environment
verifier_obj.system_wide = False
self.verifier_inst.update(verifier_id=uuid, update_venv=True)
verifier_obj.manager.install_venv.assert_called_once_with()
self.assertFalse(verifier_obj.manager.check_system_wide.called)
verifier_obj.update_status.assert_called_once_with(
consts.VerifierStatus.UPDATING)
verifier_obj.update_properties.assert_called_once_with(
status=verifier_obj.status)
verifier_obj.manager.check_system_wide.reset_mock()
verifier_obj.update_properties.reset_mock()
verifier_obj.update_status.reset_mock()
verifier_obj.manager.install_venv.reset_mock()
# check switching from virtual environment to system-wide
verifier_obj.system_wide = False
self.verifier_inst.update(verifier_id=uuid, system_wide=True)
self.assertFalse(verifier_obj.manager.install_venv.called)
verifier_obj.manager.check_system_wide.assert_called_once_with()
verifier_obj.update_status.assert_called_once_with(
consts.VerifierStatus.UPDATING)
verifier_obj.update_properties.assert_called_once_with(
status=verifier_obj.status, system_wide=True)
verifier_obj.update_status.reset_mock()
# check switching from system-wide to system-wide
verifier_obj.system_wide = True
self.verifier_inst.update(verifier_id=uuid, system_wide=True)
verifier_obj.update_status.assert_called_once_with(
consts.VerifierStatus.UPDATING)
self.assertFalse(verifier_obj.manager.install_venv.called)
@mock.patch("rally.api._Verifier._get")
def test_configure_with_wrong_state_of_verifier(self,
mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
deployment_id = "deployment"
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.configure,
verifier=verifier_id,
deployment_id=deployment_id)
self.assertIn("because verifier is in '%s' status" % status,
"%s" % e)
@mock.patch("rally.cli.commands.verify.logging.is_debug",
return_value=False)
@mock.patch("rally.api._Verifier._get")
def test_configure_when_it_is_already_configured(self,
mock___verifier__get,
mock_is_debug):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
deployment_id = "deployment"
extra = {"key": "value"}
verifier_obj.status = consts.VerifierStatus.INSTALLED
# no recreate and no extra options
self.assertEqual(verifier_obj.manager.get_configuration.return_value,
self.verifier_inst.configure(
verifier=verifier_id,
deployment_id=deployment_id,
reconfigure=False))
self.assertFalse(verifier_obj.manager.extend_configuration.called)
self.assertFalse(verifier_obj.manager.configure.called)
self.assertFalse(verifier_obj.update_status.called)
# no recreate, just extend existing configuration
self.assertEqual(verifier_obj.manager.get_configuration.return_value,
self.verifier_inst.configure(
verifier=verifier_id,
deployment_id=deployment_id,
reconfigure=False,
extra_options=extra))
verifier_obj.manager.extend_configuration.assert_called_once_with(
extra)
self.assertFalse(verifier_obj.manager.configure.called)
verifier_obj.update_status.reset_mock()
verifier_obj.manager.extend_configuration.reset_mock()
# recreate with extra options
self.assertEqual(verifier_obj.manager.configure.return_value,
self.verifier_inst.configure(
verifier=verifier_id,
deployment_id=deployment_id,
reconfigure=True,
extra_options=extra))
self.assertFalse(verifier_obj.manager.extend_configuration.called)
verifier_obj.manager.configure.assert_called_once_with(
extra_options=extra)
verifier_obj.update_status.reset_mock()
verifier_obj.manager.extend_configuration.reset_mock()
@mock.patch("rally.cli.commands.verify.logging.is_debug",
return_value=True)
@mock.patch("rally.api._Verifier._get")
def test_configure_when_it_is_already_configured_with_logging(
self, mock___verifier__get, mock_is_debug):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
deployment_id = "deployment"
extra = {"key": "value"}
verifier_obj.status = consts.VerifierStatus.INSTALLED
# no recreate and no extra options
self.assertEqual(verifier_obj.manager.get_configuration.return_value,
self.verifier_inst.configure(
verifier=verifier_id,
deployment_id=deployment_id,
reconfigure=False))
self.assertFalse(verifier_obj.manager.extend_configuration.called)
self.assertFalse(verifier_obj.manager.configure.called)
self.assertFalse(verifier_obj.update_status.called)
# no recreate, just extend existing configuration
self.assertEqual(verifier_obj.manager.get_configuration.return_value,
self.verifier_inst.configure(
verifier=verifier_id,
deployment_id=deployment_id,
reconfigure=False,
extra_options=extra))
verifier_obj.manager.extend_configuration.assert_called_once_with(
extra)
self.assertFalse(verifier_obj.manager.configure.called)
verifier_obj.update_status.reset_mock()
verifier_obj.manager.extend_configuration.reset_mock()
# recreate with extra options
self.assertEqual(verifier_obj.manager.configure.return_value,
self.verifier_inst.configure(
verifier=verifier_id,
deployment_id=deployment_id,
reconfigure=True,
extra_options=extra))
self.assertFalse(verifier_obj.manager.extend_configuration.called)
verifier_obj.manager.configure.assert_called_once_with(
extra_options=extra)
verifier_obj.update_status.reset_mock()
verifier_obj.manager.extend_configuration.reset_mock()
@mock.patch("rally.api._Verifier._get")
def test_override_config_with_wrong_state_of_verifier(
self, mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
deployment_id = "deployment"
new_content = {}
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(
exceptions.RallyException,
self.verifier_inst.override_configuration,
verifier_id=verifier_id, deployment_id=deployment_id,
new_configuration=new_content)
self.assertIn("because verifier %s is in '%s' status"
% (verifier_obj, status), "%s" % e)
@mock.patch("rally.api._Verifier._get")
def test_override_config_when_it_is_already_configured(
self, mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
deployment_id = "deployment"
new_config = {"key": "value"}
verifier_obj.status = consts.VerifierStatus.INSTALLED
self.verifier_inst.override_configuration(
verifier_id=verifier_id, deployment_id=deployment_id,
new_configuration=new_config)
verifier_obj.manager.override_configuration.assert_called_once_with(
new_config)
@mock.patch("rally.api._Verifier._get")
def test_list_tests(self, mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
pattern = "some"
verifier_obj.status = consts.VerifierStatus.INIT
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.list_tests,
verifier_id=verifier_id,
pattern=pattern)
self.assertIn("because verifier %s is in '%s' status"
% (verifier_obj, verifier_obj.status), "%s" % e)
self.assertFalse(verifier_obj.manager.list_tests.called)
verifier_obj.status = consts.VerifierStatus.INSTALLED
self.assertEqual(
verifier_obj.manager.list_tests.return_value,
self.verifier_inst.list_tests(verifier_id=verifier_id,
pattern=pattern))
verifier_obj.manager.list_tests.assert_called_once_with(pattern)
@mock.patch("rally.api._Verifier._get")
def test_add_extension(self, mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
source = "example.com"
version = 3.14159
extra_settings = {}
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.add_extension,
verifier_id=verifier_id,
source=source, version=version,
extra_settings=extra_settings)
self.assertIn("because verifier %s is in '%s' status"
% (verifier_obj, status), "%s" % e)
verifier_obj.status = consts.VerifierStatus.INSTALLED
self.verifier_inst.add_extension(
verifier_id=verifier_id, source=source, version=version,
extra_settings=extra_settings)
verifier_obj.manager.install_extension.assert_called_once_with(
source, version=version, extra_settings=extra_settings)
self.assertEqual([mock.call(consts.VerifierStatus.EXTENDING),
mock.call(verifier_obj.status)],
verifier_obj.update_status.call_args_list)
# check status will be updated in case of failure at installation step
verifier_obj.update_status.reset_mock()
verifier_obj.manager.install_extension.side_effect = RuntimeError
self.assertRaises(RuntimeError,
self.verifier_inst.add_extension,
verifier_id=verifier_id,
source=source, version=version,
extra_settings=extra_settings)
self.assertEqual([mock.call(consts.VerifierStatus.EXTENDING),
mock.call(verifier_obj.status)],
verifier_obj.update_status.call_args_list)
@mock.patch("rally.api._Verifier._get")
def test_list_extensions(self, mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.list_extensions,
verifier_id=verifier_id)
self.assertIn("because verifier %s is in '%s' status"
% (verifier_obj, status), "%s" % e)
self.assertFalse(verifier_obj.manager.list_extensions.called)
verifier_obj.status = consts.VerifierStatus.INSTALLED
self.assertEqual(verifier_obj.manager.list_extensions.return_value,
self.verifier_inst.list_extensions(
verifier_id=verifier_id))
verifier_obj.manager.list_extensions.assert_called_once_with()
@mock.patch("rally.api._Verifier._get")
def test_delete_extension(self, mock___verifier__get):
verifier_obj = mock___verifier__get.return_value
verifier_id = "uuiiiidd"
name = "some"
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(exceptions.RallyException,
self.verifier_inst.delete_extension,
verifier_id=verifier_id, name=name)
self.assertIn("because verifier %s is in '%s' status"
% (verifier_obj, status), "%s" % e)
self.assertFalse(verifier_obj.manager.list_tests.called)
verifier_obj.status = consts.VerifierStatus.INSTALLED
self.verifier_inst.delete_extension(verifier_id=verifier_id,
name=name)
verifier_obj.manager.uninstall_extension.assert_called_once_with(name)
class VerificationAPITestCase(test.TestCase):
results_data = {
"totals": {"tests_count": 2,
"tests_duration": 4,
"success": 2,
"skipped": 0,
"expected_failures": 0,
"unexpected_success": 0,
"failures": 0},
"tests": {
"test_1": {
"name": "test_1",
"status": "success",
"duration": 2,
"tags": []}
}
}
def setUp(self):
super(VerificationAPITestCase, self).setUp()
mock_api = mock.Mock()
mock_api.endpoint_url = None
self.verification_inst = api._Verification(mock_api)
@mock.patch("rally.api.objects.Verification.get")
def test_get(self, mock_verification_get):
verification_uuid = "uuiiiidd"
self.assertEqual(mock_verification_get.return_value.to_dict(),
self.verification_inst.get(
verification_uuid=verification_uuid))
mock_verification_get.assert_called_once_with(verification_uuid)
@mock.patch("rally.api.objects.Verification.get")
def test_delete(self, mock_verification_get):
verification_uuid = "uuiiiidd"
self.verification_inst.delete(verification_uuid=verification_uuid)
mock_verification_get.assert_called_once_with(verification_uuid)
mock_verification_get.return_value.delete.assert_called_once_with()
@mock.patch("rally.api.objects.Verification.list")
def test_list(self, mock_verification_list):
verifier_id = "vuuuiiddd"
deployment_id = "duuuiidd"
tags = ["foo", "bar"]
status = "some_status"
mock_verification_list.return_value = [mock.Mock()]
self.assertEqual(
[i.to_dict() for i in mock_verification_list.return_value],
self.verification_inst.list(
verifier_id=verifier_id, deployment_id=deployment_id,
tags=tags, status=status))
mock_verification_list.assert_called_once_with(
verifier_id, deployment_id=deployment_id, tags=tags,
status=status)
@mock.patch("rally.api.vreporter.VerificationReporter")
@mock.patch("rally.api.objects.Verification.get")
def test_report(self, mock_verification_get, mock_verification_reporter):
verifications = ["uuid-1", "uuid-2"]
output_type = mock.Mock()
output_dest = mock.Mock()
reporter = mock_verification_reporter.get.return_value
self.assertEqual(mock_verification_reporter.make.return_value,
self.verification_inst.report(
uuids=verifications,
output_type=output_type,
output_dest=output_dest))
mock_verification_reporter.get.assert_called_once_with(output_type)
reporter.validate.assert_called_once_with(output_dest)
mock_verification_reporter.make.assert_called_once_with(
reporter, [mock_verification_get.return_value,
mock_verification_get.return_value],
output_dest)
self.assertEqual([mock.call(u) for u in verifications],
mock_verification_get.call_args_list)
@mock.patch("rally.api.objects.Verification.create")
@mock.patch("rally.api._Verifier._get")
def test_import_results(self, mock___verifier__get,
mock_verification_create):
verifier_id = "vuuuiiddd"
deployment_id = "duuuiidd"
data = "contest of file with results"
run_args = {"set_name": "compute"}
# verifier_obj = mock___verifier__get.return_value
verifier_obj = self.verification_inst.api.verifier._get.return_value
verifier_obj.deployment = {
"name": "deployment_name",
"uuid": deployment_id}
results = self.verification_inst.import_results(
verifier_id=verifier_id, deployment_id=deployment_id,
data=data, **run_args)
verification = mock_verification_create.return_value
self.assertEqual(verification.to_dict(), results["verification"])
self.assertEqual(
verifier_obj.manager.parse_results.return_value.totals,
results["totals"])
self.verification_inst.api.verifier._get.assert_called_once_with(
verifier_id)
verifier_obj.set_env.assert_called_once_with(deployment_id)
verifier_obj.manager.validate_args.assert_called_once_with(run_args)
mock_verification_create.assert_called_once_with(
verifier_id, deployment_id=deployment_id, run_args=run_args)
verification.update_status.assert_called_once_with(
consts.VerificationStatus.RUNNING)
verifier_obj.manager.parse_results.assert_called_once_with(data)
verification.finish.assert_called_once_with(results["totals"],
results["tests"])
# check setting failed
verification.finish.reset_mock()
verifier_obj.manager.parse_results.side_effect = RuntimeError
self.assertRaises(RuntimeError,
self.verification_inst.import_results,
verifier_id=verifier_id,
deployment_id=deployment_id,
data=data,
**run_args)
self.assertFalse(verification.finish.called)
self.assertTrue(verification.set_failed.called)
@mock.patch("rally.api._Verifier._get")
@mock.patch("rally.api.objects.Deployment.get",
return_value=fakes.FakeDeployment(
uuid="deployment_uuid",
status=consts.DeployStatus.DEPLOY_FINISHED))
def test_start_failed_due_to_wrong_status_of_verifier(
self, mock_deployment_get, mock___verifier__get):
verifier_id = "vuuuiiddd"
deployment_id = "duuuiidd"
verifier_obj = self.verification_inst.api.verifier._get.return_value
for status in consts.VerifierStatus:
if status != consts.VerifierStatus.INSTALLED:
verifier_obj.status = status
e = self.assertRaises(exceptions.RallyException,
self.verification_inst.start,
verifier_id=verifier_id,
deployment_id=deployment_id)
self.assertIn(
"Failed to start verification because verifier %s is in "
"'%s' status" % (verifier_obj, verifier_obj.status),
"%s" % e)
@mock.patch("rally.api.objects.Verification.create")
@mock.patch("rally.api.objects.Deployment.get",
return_value=fakes.FakeDeployment(
uuid="deployment_uuid",
status=consts.DeployStatus.DEPLOY_FINISHED))
def test_start_with_configuring(self, mock_deployment_get,
mock_verification_create):
verifier_id = "vuuuiiddd"
deployment_id = "duuuiidd"
verifier_obj = self.verification_inst.api.verifier._get.return_value
verifier_obj.status = consts.VerifierStatus.INSTALLED
verifier_obj.deployment = {
"name": "deployment_name",
"uuid": "deployment_uuid",
"status": consts.DeployStatus.DEPLOY_FINISHED}
verifier_manager = mock.Mock()
verifier_obj.manager = verifier_manager
verifier_manager._meta_get.return_value = {}
self.verification_inst.start(verifier_id=verifier_id,
deployment_id=deployment_id)
mock_deployment_get.assert_called_once_with(deployment_id)
verifier_obj.set_env.assert_called_once_with(deployment_id)
@mock.patch("rally.api.objects.Verification.create")
@mock.patch("rally.api._Verifier.configure")
@mock.patch("rally.api.objects.Deployment.get",
return_value=fakes.FakeDeployment(
uuid="deployment_uuid",
status=consts.DeployStatus.DEPLOY_FINISHED))
def test_start(self, mock_deployment_get, mock_configure,
mock_verification_create):
verifier_id = "vuuuiiddd"
deployment_id = "duuuiidd"
tags = ["foo", "bar"]
run_args = {"arg": "value"}
verifier_obj = self.verification_inst.api.verifier._get.return_value
verifier_obj.status = consts.VerifierStatus.INSTALLED
verification_obj = mock_verification_create.return_value
verifier_obj.deployment = {"name": "deployment_name",
"uuid": deployment_id}
verifier_obj.manager._meta_get.return_value = {}
self.verification_inst.start(verifier_id=verifier_id,
deployment_id=deployment_id,
tags=tags,
**run_args)
mock_deployment_get.assert_called_once_with(deployment_id)
verifier_obj.set_env.assert_called_once_with(deployment_id)
verifier_obj.manager.validate.assert_called_once_with(run_args)
mock_verification_create.assert_called_once_with(
verifier_id=verifier_id, deployment_id=deployment_id, tags=tags,
run_args=run_args)
verification_obj.update_status.assert_called_once_with(
consts.VerificationStatus.RUNNING)
context = {"config": verifier_obj.manager._meta_get.return_value,
"run_args": run_args,
"verification": verification_obj,
"verifier": verifier_obj}
verifier_obj.manager.run.assert_called_once_with(context)
results = verifier_obj.manager.run.return_value
verification_obj.finish.assert_called_once_with(results.totals,
results.tests)
self.assertFalse(mock_configure.called)
@mock.patch("rally.api.objects.Deployment.get",
return_value=fakes.FakeDeployment(
name="xxx_name",
uuid="deployment_uuid",
status=consts.DeployStatus.DEPLOY_INIT))
def test_start_on_unfinished_deployment(self, mock_deployment_get):
verifier_id = "v_id"
deployment_id = mock_deployment_get.return_value["uuid"]
tags = ["foo", "bar"]
run_args = {"arg": "value"}
self.assertRaises(exceptions.DeploymentNotFinishedStatus,
self.verification_inst.start,
verifier_id=verifier_id,
deployment_id=deployment_id,
tags=tags, **run_args)
@mock.patch("rally.api.objects.Verification.create")
@mock.patch("rally.api.objects.Deployment.get",
return_value=fakes.FakeDeployment(
uuid="deployment_uuid",
status=consts.DeployStatus.DEPLOY_FINISHED))
def test_start_failed_to_run(self, mock_deployment_get,
mock_verification_create):
verifier_id = "vuuuiiddd"
deployment_id = "duuuiidd"
tags = ["foo", "bar"]
run_args = {"arg": "value"}
verifier_obj = self.verification_inst.api.verifier._get.return_value
verifier_obj.deployment = {"name": "deployment_name",
"uuid": deployment_id}
verifier_obj.status = consts.VerifierStatus.INSTALLED
verification_obj = mock_verification_create.return_value
verifier_manager = mock.Mock()
verifier_obj.manager = verifier_manager
verifier_manager._meta_get.return_value = {}
verifier_obj.manager.run.side_effect = RuntimeError
self.assertRaises(RuntimeError,
self.verification_inst.start,
verifier_id=verifier_id,
deployment_id=deployment_id,
tags=tags, **run_args)
verifier_obj.set_env.assert_called_once_with(deployment_id)
verifier_obj.manager.validate.assert_called_once_with(run_args)
mock_verification_create.assert_called_once_with(
verifier_id=verifier_id, deployment_id=deployment_id, tags=tags,
run_args=run_args)
verification_obj.update_status.assert_called_once_with(
consts.VerificationStatus.RUNNING)
context = {"config": verifier_obj.manager._meta_get.return_value,
"run_args": run_args,
"verification": verification_obj,
"verifier": verifier_obj}
verifier_obj.manager.run.assert_called_once_with(context)
self.assertFalse(verification_obj.finish.called)
self.assertFalse(
self.verification_inst.api.verifier.configure.called)
@mock.patch("rally.api._Verification.start")
@mock.patch("rally.api._Deployment.get")
@mock.patch("rally.api._Verification._get")
def test_rerun(self, mock___verification__get, mock___deployment_get,
mock_start):
tests = {"test_1": {"status": "success"},
"test_2": {"status": "fail"}}
mock___verification__get.return_value = mock.Mock(
uuid="uuid", verifier_uuid="v_uuid", deployment_uuid="d_uuid",
tests=tests)
self.verification_inst.api.deployment.get.return_value = {
"name": "d_name",
"uuid": "d_uuid"}
mock___deployment_get.return_value = {"name": "d_name",
"uuid": "d_uuid"}
mock_start.return_value = (
mock___verification__get.return_value,
mock.Mock(totals=self.results_data["totals"],
tests=self.results_data["tests"]))
self.verification_inst.rerun(verification_uuid="uuid",
concurrency=1)
mock_start.assert_called_once_with(
verifier_id="v_uuid", deployment_id="d_uuid",
load_list=list(tests.keys()), tags=None, concurrency=1)
@mock.patch("rally.api._Verification.start")
@mock.patch("rally.api.objects.Verification.create")
@mock.patch("rally.common.objects.Verification.get")
def test_rerun_failed_tests(self,
mock_verification_get,
mock_verification_create,
mock_start):
tests = {"test_1": {"status": "success"},
"test_2": {"status": "fail"},
"test_3": {"status": "fail"}}
mock_verification_get.return_value = mock.Mock(
uuid="uuid", verifier_uuid="v_uuid", deployment_uuid="d_uuid",
tests=tests)
self.verification_inst.return_value = mock.Mock()
self.verification_inst.api.deployment.get.return_value = {
"name": "deployment_name",
"uuid": "deployment_uuid",
}
expected_tests = [t for t, r in tests.items() if r["status"] == "fail"]
self.verification_inst.rerun(verification_uuid="uuid", failed=True)
mock_start.assert_called_once_with(
verifier_id="v_uuid", deployment_id="deployment_uuid",
load_list=expected_tests, tags=None)
@mock.patch("rally.api._Verification._get")
def test_rerun_failed_tests_raise_exc(
self, mock___verification__get):
tests = {"test_1": {"status": "success"},
"test_2": {"status": "success"},
"test_3": {"status": "skip"}}
mock___verification__get.return_value = mock.Mock(
uuid="uuid", verifier_uuid="v_uuid", deployment_uuid="d_uuid",
tests=tests)
e = self.assertRaises(exceptions.RallyException,
self.verification_inst.rerun,
verification_uuid="uuid",
failed=True)
self.assertEqual("There are no failed tests from verification "
"(UUID=uuid).", "%s" % e)