rally/tests/benchmark/test_validation.py
Tzanetos Balitsaris 54d793fb25 Add required_contexts validator
Add a validator that checks if a benchmark scenario has defined in its
configuration file the context(s) that it requires to run first.

Example:
@validation.required_contexts("context1", "context2")
def benchmark_scenario():
  pass

Change-Id: Id83a6ff93acde2abbb29ec8351210e38d725ce48
2014-08-11 16:41:43 +04:00

739 lines
29 KiB
Python

# Copyright 2014: 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.
import os
from glanceclient import exc as glance_exc
import mock
from novaclient import exceptions as nova_exc
from rally.benchmark import validation
from rally import consts
from rally.openstack.common.gettextutils import _
from tests import fakes
from tests import test
TEMPEST = "rally.verification.verifiers.tempest.tempest"
class ValidationUtilsTestCase(test.TestCase):
def _get_scenario_validators(self, func_, scenario_, reset=True):
"""Unwrap scenario validators created by validation.validator()."""
if reset:
if hasattr(func_, "permission"):
del func_.permission
if hasattr(scenario_, "validators"):
del scenario_.validators
scenario = validation.validator(func_)()(scenario_)
return scenario.validators
def test_validator(self):
failure = validation.ValidationResult(False)
func = lambda *args, **kv: kv
scenario = lambda: None
# Check arguments passed to validator
wrap = validation.validator(func)
wrap_args = ["foo", "bar"]
wrap_kwargs = {"foo": "spam"}
wrap_scenario = wrap(*wrap_args, **wrap_kwargs)
wrap_validator = wrap_scenario(scenario)
validators = wrap_validator.validators
self.assertEqual(1, len(validators))
validator, = validators
self.assertEqual(wrap_kwargs, validator(None, None, None))
self.assertEqual(wrap_validator, scenario)
# Default permission
validator, = self._get_scenario_validators(func, scenario)
self.assertEqual(validator.permission,
validation.consts.EndpointPermission.USER)
# Custom permission
func.permission = "another_permission"
del scenario.validators
validator, = self._get_scenario_validators(func, scenario, reset=False)
self.assertEqual(validator.permission, "another_permission")
# Default result
func_success = lambda *a, **kv: None
validator, = self._get_scenario_validators(func_success, scenario)
self.assertTrue(validator(None, None, None).is_valid)
# Failure result
func_failure = lambda *a, **kv: failure
validator, = self._get_scenario_validators(func_failure, scenario)
self.assertFalse(validator(None, None, None).is_valid)
def test_required_contexts(self):
config = {"context": {"context01": {}, "context02": {}}}
required_contexts = (lambda *contexts:
validation.required_contexts(*contexts)
(lambda: None).validators.pop()
(config, None, None))
# All the required contexts are defined
result = required_contexts("context01", "context02")
self.assertTrue(result.is_valid)
# A required context is not defined
result = required_contexts("context03")
self.assertFalse(result.is_valid)
def test_required_services(self):
available_services = {
consts.ServiceType.IDENTITY: consts.Service.KEYSTONE,
consts.ServiceType.COMPUTE: consts.Service.NOVA,
consts.ServiceType.IMAGE: consts.Service.GLANCE}
clients = mock.Mock(
services=mock.Mock(return_value=available_services))
# Unwrap
required_services = (lambda *services:
validation.required_services(*services)
(lambda: None).validators.pop()
(None, clients, None))
# Services are available
result = required_services(consts.Service.KEYSTONE)
self.assertTrue(result.is_valid)
# Service is not available
service = consts.Service.CEILOMETER
result = required_services(consts.Service.KEYSTONE, service)
self.assertFalse(result.is_valid)
# Service is unknown
service = "unknown_service"
result = required_services(consts.Service.KEYSTONE, service)
self.assertFalse(result.is_valid)
def test_add(self):
def test_validator():
pass
@validation.add(test_validator)
def test_function():
pass
validators = getattr(test_function, "validators")
self.assertEqual(len(validators), 1)
self.assertEqual(validators[0], test_validator)
def test_requires_permission(self):
def test_permission():
pass
@validation.add(test_permission)
@validation.requires_permission(test_permission)
def test_function():
pass
validators = getattr(test_function, "validators")
self.assertEqual(len(validators), 1)
self.assertEqual(validators, [test_permission])
def test_number_invalid(self):
validator = validation.number('param', 0, 10, nullable=False)
config = {"args": {"param": -1}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
config = {"args": {"param": 11}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
config = {"args": {"param": "not an int"}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
config = {"args": {"param": None}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
config = {"args": {}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
config = {"args": {"param": -0.1}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
def test_number_integer_only(self):
validator = validation.number('param', 0, 10, nullable=False,
integer_only=True)
config = {"args": {"param": "5.0"}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
validator = validation.number('param', 0, 10, nullable=False,
integer_only=False)
config = {"args": {"param": "5.0"}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
def test_number_valid(self):
validator = validation.number('param', 0, 10, nullable=False)
config = {"args": {"param": 0}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
config = {"args": {"param": 10}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
config = {"args": {"param": 10.0}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
config = {"args": {"param": 5.6}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
def test_number_nullable(self):
validator = validation.number('param', 0, 10, nullable=True)
config = {"args": {"param": None}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
config = {"args": {}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
config = {"args": {"param": -1}}
result = validator(config, None, None)
self.assertFalse(result.is_valid)
config = {"args": {"param": 0}}
result = validator(config, None, None)
self.assertTrue(result.is_valid)
@mock.patch("os.access")
def test_file_exists(self, mock_access):
validator = validation.file_exists('param')
config = {"args": {"param": "/tmp/foo"}}
result = validator(config, None, None)
mock_access.assert_called_once_with('/tmp/foo', os.R_OK)
self.assertTrue(result.is_valid)
@mock.patch("os.access", return_value=False)
def test_file_exists_negative(self, mock_access):
validator = validation.file_exists('param')
config = {"args": {"param": "/tmp/bah"}}
result = validator(config, None, None)
mock_access.assert_called_with('/tmp/bah', os.R_OK)
self.assertFalse(result.is_valid)
@mock.patch("rally.osclients.Clients")
def test_image_exists(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
fakegclient.images.get = mock.MagicMock()
mock_osclients.glance.return_value = fakegclient
validator = validation.image_exists("image")
test_img_id = "test_image_id"
resource = {"id": test_img_id}
config = {"args": {"image": resource}}
result = validator(config, clients=mock_osclients, task=None)
fakegclient.images.get.assert_called_once_with(image=test_img_id)
self.assertTrue(result.is_valid)
self.assertIsNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_image_exists_fail(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
fakegclient.images.get = mock.MagicMock()
fakegclient.images.get.side_effect = glance_exc.HTTPNotFound
mock_osclients.glance.return_value = fakegclient
validator = validation.image_exists("image")
test_img_id = "test_image_id"
resource = {"id": test_img_id}
config = {"args": {"image": resource}}
result = validator(config, clients=mock_osclients, task=None)
fakegclient.images.get.assert_called_once_with(image=test_img_id)
self.assertFalse(result.is_valid)
self.assertIsNotNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_flavor_exists(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fakenclient.flavors = mock.MagicMock()
mock_osclients.nova.return_value = fakenclient
validator = validation.flavor_exists("flavor")
test_flavor_id = 1
resource = {"id": test_flavor_id}
config = {"args": {"flavor": resource}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=test_flavor_id)
self.assertTrue(result.is_valid)
self.assertIsNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_flavor_exists_fail(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fakenclient.flavors = mock.MagicMock()
fakenclient.flavors.get.side_effect = nova_exc.NotFound(code=404)
mock_osclients.nova.return_value = fakenclient
validator = validation.flavor_exists("flavor")
test_flavor_id = 101
resource = {"id": test_flavor_id}
config = {"args": {"flavor": resource}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=test_flavor_id)
self.assertFalse(result.is_valid)
self.assertIsNotNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_image_valid_on_flavor(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
image = fakes.FakeImage()
image.min_ram = 0
image.size = 0
image.min_disk = 0
fakegclient.images.get = mock.MagicMock(return_value=image)
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
flavor = fakes.FakeFlavor()
flavor.ram = 1
flavor.disk = 1
fakenclient.flavors.get = mock.MagicMock(return_value=flavor)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
config = {"args": {"image": {"id": image.id},
"flavor": {"id": flavor.id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=flavor.id)
fakegclient.images.get.assert_called_once_with(image=image.id)
self.assertTrue(result.is_valid)
self.assertIsNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_image_valid_on_flavor_fail(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
image = fakes.FakeImage()
image.min_ram = 1
image.size = 1
image.min_disk = 1
fakegclient.images.get = mock.MagicMock(return_value=image)
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
flavor = fakes.FakeFlavor()
flavor.ram = 0
flavor.disk = 0
fakenclient.flavors.get = mock.MagicMock(return_value=flavor)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
config = {"args": {"image": {"id": image.id},
"flavor": {"id": flavor.id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=flavor.id)
fakegclient.images.get.assert_called_once_with(image=image.id)
self.assertFalse(result.is_valid)
self.assertIsNotNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_image_invalid_on_flavor(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
image = fakes.FakeImage()
image.min_ram = 0
image.size = 0
image.min_disk = 0
fakegclient.images.get = mock.MagicMock(return_value=image)
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
flavor = fakes.FakeFlavor()
flavor.ram = 1
flavor.disk = -1
fakenclient.flavors.get = mock.MagicMock(return_value=flavor)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
config = {"args": {"image": {"id": image.id},
"flavor": {"id": flavor.id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=flavor.id)
fakegclient.images.get.assert_called_once_with(image=image.id)
self.assertFalse(result.is_valid)
self.assertEqual(result.msg, _("The disk size for flavor 'flavor-id-0'"
" is too small for requested image 'image-id-0'"))
@mock.patch("rally.osclients.Clients")
def test_image_invalid_on_size(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
image = fakes.FakeImage()
image.min_ram = 0
image.size = 0
image.min_disk = 100
fakegclient.images.get = mock.MagicMock(return_value=image)
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
flavor = fakes.FakeFlavor()
flavor.ram = 1
flavor.disk = 99
fakenclient.flavors.get = mock.MagicMock(return_value=flavor)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
config = {"args": {"image": {"id": image.id},
"flavor": {"id": flavor.id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=flavor.id)
fakegclient.images.get.assert_called_once_with(image=image.id)
self.assertFalse(result.is_valid)
self.assertEqual(result.msg, _("The disk size for flavor 'flavor-id-0'"
" is too small for requested image 'image-id-0'"))
@mock.patch("rally.osclients.Clients")
def test_image_valid_on_missing_flavor_disk(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
image = fakes.FakeImage()
image.min_ram = 0
image.size = 0
image.min_disk = 100
fakegclient.images.get = mock.MagicMock(return_value=image)
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
flavor = fakes.FakeFlavor()
flavor.ram = 1
fakenclient.flavors.get = mock.MagicMock(return_value=flavor)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
config = {"args": {"image": {"id": image.id},
"flavor": {"id": flavor.id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=flavor.id)
fakegclient.images.get.assert_called_once_with(image=image.id)
self.assertTrue(result.is_valid)
@mock.patch("rally.osclients.Clients")
def test_image_valid_on_flavor_image_not_exist(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
fakegclient.images.get = mock.MagicMock()
fakegclient.images.get.side_effect = glance_exc.HTTPNotFound
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
flavor = fakes.FakeFlavor()
fakenclient.flavors.get = mock.MagicMock(return_value=flavor)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
test_img_id = "test_image_id"
config = {"args": {"flavor": {"id": flavor.id},
"image": {"id": test_img_id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=flavor.id)
fakegclient.images.get.assert_called_once_with(image=test_img_id)
self.assertFalse(result.is_valid)
self.assertEqual(result.msg, "Image with id 'test_image_id' not found")
@mock.patch("rally.osclients.Clients")
def test_network_exists(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fake_network = fakes.FakeNetwork()
fake_network.label = "private"
fake_network.id = "net_id_1234"
fakenclient.networks.list = mock.MagicMock(
return_value=[fake_network])
mock_osclients.nova.return_value = fakenclient
validator = validation.network_exists("fixed_network")
network_name = "private"
config = {"args": {"fixed_network": network_name}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.networks.list.assert_called_once_with()
self.assertTrue(result.is_valid)
self.assertIsNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_network_exists_fail(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fake_network = fakes.FakeNetwork()
fake_network.label = "private"
fake_network.id = "net_id_1234"
fakenclient.networks.list = mock.MagicMock(
return_value=[fake_network])
mock_osclients.nova.return_value = fakenclient
validator = validation.network_exists("fixed_network")
network_name = "foo"
config = {"args": {"fixed_network": network_name}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.networks.list.assert_called_once_with()
self.assertFalse(result.is_valid)
self.assertEqual(result.msg,
"Network with name foo not found. "
"Available networks: ['private']")
@mock.patch("rally.osclients.Clients")
def test_external_network_exists(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fake_pool = fakes.FakeFloatingIPPool()
fake_pool.name = "floating"
fakenclient.floating_ip_pools.list = mock.MagicMock(
return_value=[fake_pool])
mock_osclients.nova.return_value = fakenclient
validator = validation.external_network_exists("floating_network",
"use_floatingip")
network_name = "floating"
config = {"args": {"floating_network": network_name}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.floating_ip_pools.list.assert_called_once_with()
self.assertTrue(result.is_valid)
self.assertIsNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_external_network_exists_ignored(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fake_pool = fakes.FakeFloatingIPPool()
fake_pool.name = "floating"
fakenclient.floating_ip_pools.list = mock.MagicMock(
return_value=[fake_pool])
mock_osclients.nova.return_value = fakenclient
validator = validation.external_network_exists("floating_network",
"use_floatingip")
network_name = "not_used"
config = {"args": {"floating_network": network_name,
"use_floatingip": False}}
result = validator(config, clients=mock_osclients, task=None)
self.assertFalse(fakenclient.floating_ip_pools.list.called)
self.assertTrue(result.is_valid)
self.assertIsNone(result.msg)
@mock.patch("rally.osclients.Clients")
def test_external_network_exists_fail(self, mock_osclients):
fakenclient = fakes.FakeNovaClient()
fake_pool = fakes.FakeFloatingIPPool()
fake_pool.name = "floating"
fakenclient.floating_ip_pools.list = mock.MagicMock(
return_value=[fake_pool])
mock_osclients.nova.return_value = fakenclient
validator = validation.external_network_exists("floating_network",
"use_floatingip")
network_name = "foo"
config = {"args": {"floating_network": network_name}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.floating_ip_pools.list.assert_called_once_with()
self.assertFalse(result.is_valid)
self.assertEqual(result.msg, "External (floating) network with name "
"foo not found. "
"Available networks: ['floating']")
@mock.patch("rally.osclients.Clients")
def test_image_valid_on_flavor_flavor_not_exist(self, mock_osclients):
fakegclient = fakes.FakeGlanceClient()
mock_osclients.glance.return_value = fakegclient
fakenclient = fakes.FakeNovaClient()
fakenclient.flavors = mock.MagicMock()
fakenclient.flavors.get.side_effect = nova_exc.NotFound(code=404)
mock_osclients.nova.return_value = fakenclient
validator = validation.image_valid_on_flavor("flavor", "image")
test_img_id = "test_image_id"
test_flavor_id = 101
config = {"args": {"flavor": {"id": test_flavor_id},
"image": {"id": test_img_id}}}
result = validator(config, clients=mock_osclients, task=None)
fakenclient.flavors.get.assert_called_once_with(flavor=test_flavor_id)
self.assertFalse(result.is_valid)
self.assertEqual(result.msg, "Flavor with id '101' not found")
@mock.patch(TEMPEST + ".Tempest.is_configured", return_value=True)
@mock.patch(TEMPEST + ".Tempest.is_installed", return_value=True)
@mock.patch(TEMPEST + ".subprocess")
def test_tempest_test_name_not_valid(self, mock_sp, mock_install,
mock_config):
mock_sp.Popen().communicate.return_value = (
"tempest.api.fake_test1[gate]\ntempest.api.fate_test2\n",)
validator = validation.tempest_tests_exists()
result = validator(test_name="no_valid_test_name",
task=mock.MagicMock())
self.assertFalse(result.is_valid)
self.assertEqual("One or more tests not found: 'no_valid_test_name'",
result.msg)
@mock.patch(TEMPEST + ".Tempest.is_configured", return_value=True)
@mock.patch(TEMPEST + ".Tempest.is_installed", return_value=True)
@mock.patch(TEMPEST + ".subprocess")
def test_tempest_test_name_valid(self, mock_sp, mock_install, mock_config):
mock_sp.Popen().communicate.return_value = (
"tempest.api.compute.fake_test1[gate]\n"
"tempest.api.image.fake_test2\n",)
validator = validation.tempest_tests_exists()
result = validator(test_name="image.fake_test2", task=mock.MagicMock())
self.assertTrue(result.is_valid)
@mock.patch(TEMPEST + ".Tempest.is_configured", return_value=True)
@mock.patch(TEMPEST + ".Tempest.is_installed", return_value=True)
@mock.patch(TEMPEST + ".subprocess")
def test_tempest_test_names_one_invalid(self, mock_sp, mock_install,
mock_config):
mock_sp.Popen().communicate.return_value = ('\n'.join([
"tempest.api.fake_test1[gate]",
"tempest.api.fake_test2",
"tempest.api.fake_test3[gate,smoke]",
"tempest.api.fate_test4[fake]"]),)
validator = validation.tempest_tests_exists()
result = validator(test_names=["tempest.api.fake_test2",
"tempest.api.invalid.test"],
task=mock.MagicMock())
self.assertFalse(result.is_valid)
self.assertEqual(_("One or more tests not found: '%s'") %
"tempest.api.invalid.test", result.msg)
@mock.patch(TEMPEST + ".Tempest.is_configured", return_value=True)
@mock.patch(TEMPEST + ".Tempest.is_installed", return_value=True)
@mock.patch(TEMPEST + ".subprocess")
def test_tempest_test_names_all_invalid(self, mock_sp, mock_install,
mock_config):
mock_sp.Popen().communicate.return_value = ("\n".join([
"tempest.api.fake_test1[gate]",
"tempest.api.fake_test2",
"tempest.api.fake_test3[gate,smoke]",
"tempest.api.fate_test4[fake]"]),)
validator = validation.tempest_tests_exists()
result = validator(test_names=["tempest.api.invalid.test1",
"tempest.api.invalid.test2"],
task=mock.MagicMock())
self.assertFalse(result.is_valid)
self.assertEqual(
_("One or more tests not found: '%s'") %
"tempest.api.invalid.test1', 'tempest.api.invalid.test2",
result.msg)
@mock.patch(TEMPEST + ".Tempest.is_configured", return_value=True)
@mock.patch(TEMPEST + ".Tempest.is_installed", return_value=True)
@mock.patch(TEMPEST + '.subprocess')
def test_tempest_test_names_all_valid(self, mock_sp, mock_install,
mock_config):
mock_sp.Popen().communicate.return_value = ("\n".join([
"tempest.api.fake_test1[gate]",
"tempest.api.fake_test2",
"tempest.api.fake_test3[gate,smoke]",
"tempest.api.fate_test4[fake]"]),)
validator = validation.tempest_tests_exists()
result = validator(test_names=["tempest.api.fake_test1",
"tempest.api.fake_test2"],
task=mock.MagicMock())
self.assertTrue(result.is_valid)
@mock.patch(TEMPEST + ".Tempest.is_configured", return_value=False)
@mock.patch(TEMPEST + ".Tempest.is_installed", return_value=False)
@mock.patch(TEMPEST + ".Tempest.install")
@mock.patch(TEMPEST + ".Tempest.generate_config_file")
@mock.patch(TEMPEST + '.subprocess')
def test_tempest_test_no_config_install(self, mock_sp, mock_gen,
mock_inst, mock_install,
mock_config):
mock_sp.Popen().communicate.return_value = ("\n".join([
"tempest.api.fake_test1[gate]",
"tempest.api.fake_test2",
"tempest.api.fake_test3[gate,smoke]",
"tempest.api.fate_test4[fake]"]),)
validator = validation.tempest_tests_exists()
result = validator(test_names=["tempest.api.fake_test1",
"tempest.api.fake_test2"],
task=mock.MagicMock())
self.assertTrue(result.is_valid)
def test_tempest_set_exists_fail(self):
validator = validation.tempest_set_exists()
result = validator(set_name="faketest",
task=mock.MagicMock())
self.assertFalse(result.is_valid)
def test_tempest_set_exists(self):
validator = validation.tempest_set_exists()
result = validator(set_name="network",
task=mock.MagicMock())
self.assertTrue(result.is_valid)
def test_required_parameters(self):
validator = validation.required_parameters("test1")
config = {"args": {}}
result = validator(config, clients=None, task=mock.MagicMock())
self.assertFalse(result.is_valid)