Additional checks for ceilometers and designate scenarios

Patch adds verification of resuls of creation and list actions.
Patch contains changes in both scenarios and unit tests and affect on following scenarios:
rally/plugins/openstack/scenarios/ceilometer/events.py
rally/plugins/openstack/scenarios/ceilometer/resources.py
rally/plugins/openstack/scenarios/designate/basic.py
rally/plugins/openstack/scenarios/glance/images.py
rally/plugins/openstack/scenarios/heat/stacks.py
rally/plugins/openstack/scenarios/ironic/nodes.py
rally/plugins/openstack/scenarios/keystone/basic.py
rally/plugins/openstack/scenarios/magnum/clusters.py
rally/plugins/openstack/scenarios/manila/shares.py

Change-Id: I5b0156c809cc4be3e265198e64fea1e9251c78a9
This commit is contained in:
astaroverov
2016-12-06 14:33:45 +03:00
parent 64f875c4f6
commit d5a08d982d
16 changed files with 256 additions and 57 deletions

View File

@@ -17,7 +17,6 @@ Scenarios for Ceilometer Events API.
"""
from rally import consts
from rally import exceptions
from rally.plugins.openstack import scenario
from rally.plugins.openstack.scenarios.ceilometer import utils as cutils
from rally.plugins.openstack.scenarios.keystone import basic as kbasic
@@ -45,10 +44,9 @@ class CeilometerEventsCreateUserAndListEvents(cutils.CeilometerScenario,
"""
self.admin_keystone.create_user()
events = self._list_events()
if not events:
raise exceptions.RallyException(
"Events list is empty, but it should include at least one "
"event about user creation")
msg = ("Events list is empty, but it should include at least one "
"event about user creation")
self.assertTrue(events, msg)
@validation.required_services(consts.Service.CEILOMETER,
@@ -68,10 +66,9 @@ class CeilometerEventsCreateUserAndListEventTypes(cutils.CeilometerScenario,
"""
self.admin_keystone.create_user()
event_types = self._list_event_types()
if not event_types:
raise exceptions.RallyException(
"Event types list is empty, but it should include at least one"
" type about user creation")
msg = ("Event types list is empty, but it should include at least one"
" type about user creation")
self.assertTrue(event_types, msg)
@validation.required_services(consts.Service.CEILOMETER,
@@ -91,9 +88,7 @@ class CeilometerEventsCreateUserAndGetEvent(cutils.CeilometerScenario,
"""
self.admin_keystone.create_user()
events = self._list_events()
if not events:
raise exceptions.RallyException(
"Events list is empty, but it should include at least one "
"event about user creation")
event = events[0]
self._get_event(event_id=event.message_id)
msg = ("Events list is empty, but it should include at least one "
"event about user creation")
self.assertTrue(events, msg)
self._get_event(event_id=events[0].message_id)

View File

@@ -13,7 +13,6 @@
# under the License.
from rally import consts
from rally import exceptions
from rally.plugins.openstack import scenario
from rally.plugins.openstack.scenarios.ceilometer import utils as ceiloutils
from rally.task import validation
@@ -67,10 +66,9 @@ class GetTenantResources(ceiloutils.CeilometerScenario):
GET /v2/resources/(resource_id)
"""
resources = self.context["tenant"].get("resources", [])
if not resources:
msg = ("No resources found for tenant: %s"
% self.context["tenant"].get("name"))
raise exceptions.NotFoundException(message=msg)
msg = ("No resources found for tenant: %s"
% self.context["tenant"].get("name"))
self.assertTrue(resources, msg)
for res_id in resources:
self._get_resource(res_id)

View File

@@ -42,8 +42,11 @@ class CreateAndListDomains(utils.DesignateScenario):
performance of the "designate domain-list" command depending on
the number of domains owned by users.
"""
self._create_domain()
self._list_domains()
domain = self._create_domain()
msg = "Domain isn't created"
self.assertTrue(domain, msg)
list_domains = self._list_domains()
self.assertIn(domain, list_domains)
@validation.required_services(consts.Service.DESIGNATE)
@@ -170,11 +173,14 @@ class CreateAndListRecords(utils.DesignateScenario):
domain = self._create_domain()
key = "designate.create_%s_records" % records_per_domain
records = []
with atomic.ActionTimer(self, key):
for i in range(records_per_domain):
self._create_record(domain, atomic_action=False)
records.append(
self._create_record(domain, atomic_action=False))
self._list_records(domain["id"])
list_records = self._list_records(domain["id"])
self.assertEqual(records, list_records)
@validation.required_services(consts.Service.DESIGNATE)
@@ -192,8 +198,10 @@ class CreateAndListServers(utils.DesignateScenario):
performance of the "designate server-list" command depending on
the number of servers owned by users.
"""
self._create_server()
self._list_servers()
server = self._create_server()
self.assertTrue(server)
list_servers = self._list_servers()
self.assertIn(server, list_servers)
@validation.required_services(consts.Service.DESIGNATE)
@@ -245,8 +253,10 @@ class CreateAndListZones(utils.DesignateScenario):
performance of the "openstack zone list" command depending on
the number of zones owned by users.
"""
self._create_zone()
self._list_zones()
zone = self._create_zone()
self.assertTrue(zone)
list_zones = self._list_zones()
self.assertIn(zone, list_zones)
@validation.required_services(consts.Service.DESIGNATE)

View File

@@ -51,11 +51,13 @@ class CreateAndListImage(utils.GlanceScenario, nova_utils.NovaScenario):
ami, ari, aki, vhd, vmdk, raw, qcow2, vdi, and iso
:param kwargs: optional parameters to create image
"""
self._create_image(container_format,
image_location,
disk_format,
**kwargs)
self._list_images()
image = self._create_image(container_format,
image_location,
disk_format,
**kwargs)
self.assertTrue(image)
image_list = self._list_images()
self.assertIn(image.id, [i.id for i in image_list])
@validation.required_services(consts.Service.GLANCE)
@@ -137,6 +139,5 @@ class CreateImageAndBootInstances(utils.GlanceScenario,
image_location,
disk_format,
**create_image_kwargs)
image_id = image.id
self._boot_servers(image_id, flavor, number_instances,
self._boot_servers(image.id, flavor, number_instances,
**boot_server_kwargs)

View File

@@ -44,8 +44,11 @@ class CreateAndListStack(utils.HeatScenario):
:param files: files used in template
:param environment: stack environment definition
"""
self._create_stack(template_path, parameters, files, environment)
self._list_stacks()
stack = self._create_stack(template_path, parameters,
files, environment)
self.assertTrue(stack)
list_stacks = self._list_stacks()
self.assertIn(stack.id, [i.id for i in list_stacks])
@validation.required_services(consts.Service.HEAT)

View File

@@ -61,11 +61,12 @@ class CreateAndListNode(utils.IronicScenario):
:param kwargs: Optional additional arguments for node creation
"""
self._create_node(**kwargs)
self._list_nodes(
node = self._create_node(**kwargs)
self.assertTrue(node)
list_nodes = self._list_nodes(
associated=associated, maintenance=maintenance, marker=marker,
limit=limit, detail=detail, sort_key=sort_key, sort_dir=sort_dir)
self.assertIn(node, list_nodes)
@validation.required_parameters("driver")

View File

@@ -153,6 +153,7 @@ class CreateAndListUsers(KeystoneBasic):
:param kwargs: Other optional parameters to create users like
"tenant_id", "enabled".
"""
kwargs.pop("name", None)
self.admin_keystone.create_user(**kwargs)
self.admin_keystone.list_users()

View File

@@ -61,5 +61,8 @@ class CreateAndListClusters(utils.MagnumScenario):
cluster_template_uuid = kwargs.get("cluster_template_uuid", None)
if cluster_template_uuid is None:
cluster_template_uuid = self.context["tenant"]["cluster_template"]
self._create_cluster(cluster_template_uuid, node_count, **kwargs)
self._list_clusters(**kwargs)
cluster = self._create_cluster(cluster_template_uuid,
node_count, **kwargs)
self.assertTrue(cluster)
list_clusters = self._list_clusters(**kwargs)
self.assertIn(cluster, list_clusters)

View File

@@ -104,4 +104,4 @@ class CeilometerResourcesTestCase(test.ScenarioTestCase):
context = {"user": {"tenant_id": "fake"},
"tenant": {"id": "fake", "resources": resource_list}}
scenario.context = context
self.assertRaises(exceptions.NotFoundException, scenario.run)
self.assertRaises(exceptions.RallyAssertionError, scenario.run)

View File

@@ -16,6 +16,7 @@
import mock
from rally import exceptions
from rally.plugins.openstack.scenarios.designate import basic
from tests.unit import test
@@ -29,10 +30,31 @@ class DesignateBasicTestCase(test.ScenarioTestCase):
def test_create_and_list_domains(self,
mock__create_domain,
mock__list_domains):
mock__create_domain.return_value = "fake_domain.xyz"
mock__list_domains.return_value = (["fake_domain.org",
"fake_domain.xyz",
"ultimate_question.net"])
basic.CreateAndListDomains(self.context).run()
mock__create_domain.assert_called_once_with()
mock__list_domains.assert_called_once_with()
@mock.patch("%s.CreateAndListDomains._list_domains" % BASE)
@mock.patch("%s.CreateAndListDomains._create_domain" % BASE)
def test_create_and_list_domains_fails(self,
mock__create_domain,
mock__list_domains):
mock__list_domains.return_value = (["fake_domain.org",
"fake_domain.xyz",
"ultimate_question.net"])
scenario = basic.CreateAndListDomains(self.context)
self.assertRaises(exceptions.RallyAssertionError, scenario.run)
mock__create_domain.assert_called_once_with()
mock__create_domain.return_value = "fake_not_existed_domain.xyz"
self.assertRaises(exceptions.RallyAssertionError, scenario.run)
mock__create_domain.assert_called_with()
mock__list_domains.assert_called_with()
@mock.patch("%s.CreateAndDeleteDomain._delete_domain" % BASE)
@mock.patch("%s.CreateAndDeleteDomain._create_domain" % BASE,
return_value={"id": "123"})
@@ -76,12 +98,16 @@ class DesignateBasicTestCase(test.ScenarioTestCase):
"id": "123"}
mock__create_domain.return_value = domain
records_per_domain = 5
return_value = mock.call(domain, atomic_action=False)
mock__create_record.return_value = return_value
mock__list_records.return_value = [return_value] * records_per_domain
basic.CreateAndListRecords(self.context).run(
records_per_domain=records_per_domain)
mock__create_domain.assert_called_once_with()
self.assertEqual(mock__create_record.mock_calls,
[mock.call(domain, atomic_action=False)]
[return_value]
* records_per_domain)
mock__list_records.assert_called_once_with(domain["id"])
@@ -122,11 +148,32 @@ class DesignateBasicTestCase(test.ScenarioTestCase):
def test_create_and_list_servers(self,
mock__create_server,
mock__list_servers):
mock__create_server.return_value = "fake_server"
mock__list_servers.return_value = ["fake_srv1",
"fake_srv2",
"fake_server"]
# Positive case:
basic.CreateAndListServers(self.context).run()
mock__create_server.assert_called_once_with()
mock__list_servers.assert_called_once_with()
# Negative case: server isn't created
mock__create_server.return_value = None
self.assertRaises(exceptions.RallyAssertionError,
basic.CreateAndListServers(self.context).run)
mock__create_server.assert_called_with()
# Negative case: server not found in the list of existed servers
mock__create_server.return_value = "The_main_server_of_the_universe"
self.assertRaises(exceptions.RallyAssertionError,
basic.CreateAndListServers(self.context).run)
mock__create_server.assert_called_with()
mock__list_servers.assert_called_with()
@mock.patch("%s.CreateAndDeleteServer._delete_server" % BASE)
@mock.patch("%s.CreateAndDeleteServer._create_server" % BASE,
return_value={"id": "123"})
@@ -149,10 +196,28 @@ class DesignateBasicTestCase(test.ScenarioTestCase):
def test_create_and_list_zones(self,
mock__create_zone,
mock__list_zones):
mock__create_zone.return_value = "Area_51"
mock__list_zones.return_value = ["Area_51",
"Siachen",
"Bagram"]
# Positive case:
basic.CreateAndListZones(self.context).run()
mock__create_zone.assert_called_once_with()
mock__list_zones.assert_called_once_with()
# Negative case: zone isn't created
mock__create_zone.return_value = None
self.assertRaises(exceptions.RallyAssertionError,
basic.CreateAndListZones(self.context).run)
mock__create_zone.assert_called_with()
# Negative case: created zone not in the list of available zones
mock__create_zone.return_value = "HAARP"
self.assertRaises(exceptions.RallyAssertionError,
basic.CreateAndListZones(self.context).run)
mock__create_zone.assert_called_with()
mock__list_zones.assert_called_with()
@mock.patch("%s.CreateAndDeleteZone._delete_zone" % BASE)
@mock.patch("%s.CreateAndDeleteZone._create_zone" % BASE,
return_value={"id": "123"})

View File

@@ -15,6 +15,7 @@
import mock
from rally import exceptions
from rally.plugins.openstack.scenarios.glance import images
from tests.unit import fakes
from tests.unit import test
@@ -26,18 +27,43 @@ class GlanceImagesTestCase(test.ScenarioTestCase):
@mock.patch("%s.CreateAndListImage._list_images" % BASE)
@mock.patch("%s.CreateAndListImage._create_image" % BASE)
@mock.patch("%s.CreateAndListImage.generate_random_name" % BASE,
return_value="test-rally-image")
def test_create_and_list_image(self,
mock_random_name,
mock_create_image,
mock_list_images):
fake_image = fakes.FakeImage(id=1, name="img_name1")
mock_create_image.return_value = fake_image
mock_list_images.return_value = [
fakes.FakeImage(id=0, name="img_name1"),
fake_image,
fakes.FakeImage(id=2, name="img_name1")
]
# Positive case
images.CreateAndListImage(self.context).run(
"cf", "url", "df", fakearg="f")
mock_create_image.assert_called_once_with(
"cf", "url", "df", fakearg="f")
mock_list_images.assert_called_once_with()
# Negative case: image isn't created
mock_create_image.return_value = None
self.assertRaises(exceptions.RallyAssertionError,
images.CreateAndListImage(self.context).run,
"cf", "url", "df", fakearg="f")
mock_create_image.assert_called_with(
"cf", "url", "df", fakearg="f")
# Negative case: created image n ot in the list of available images
mock_create_image.return_value = fakes.FakeImage(
id=12, name="img_nameN")
self.assertRaises(exceptions.RallyAssertionError,
images.CreateAndListImage(self.context).run,
"cf", "url", "df", fakearg="f")
mock_create_image.assert_called_with(
"cf", "url", "df", fakearg="f")
mock_list_images.assert_called_with()
@mock.patch("%s.ListImages._list_images" % BASE)
def test_list_images(self, mock_list_images__list_images):
images.ListImages(self.context).run()

View File

@@ -15,6 +15,7 @@
import mock
from rally import exceptions
from rally.plugins.openstack.scenarios.heat import stacks
from tests.unit import test
@@ -33,12 +34,14 @@ class HeatStacksTestCase(test.ScenarioTestCase):
@mock.patch("%s.CreateAndListStack._list_stacks" % BASE)
@mock.patch("%s.CreateAndListStack._create_stack" % BASE)
@mock.patch("%s.CreateAndListStack.generate_random_name" % BASE,
return_value="test-rally-stack")
def test_create_and_list_stack(self,
mock_generate_random_name,
mock__create_stack,
mock__list_stacks):
stack = mock.Mock()
mock__create_stack.return_value = stack
mock__list_stacks.return_value = [stack] * 3
# Positive case:
stacks.CreateAndListStack(self.context).run(
template_path=self.default_template,
parameters=self.default_parameters,
@@ -50,6 +53,34 @@ class HeatStacksTestCase(test.ScenarioTestCase):
self.default_files, self.default_environment)
mock__list_stacks.assert_called_once_with()
# Negative case1: stack isn't created
mock__create_stack.return_value = None
self.assertRaises(exceptions.RallyAssertionError,
stacks.CreateAndListStack(self.context).run,
template_path=self.default_template,
parameters=self.default_parameters,
files=self.default_files,
environment=self.default_environment)
mock__create_stack.assert_called_with(
self.default_template, self.default_parameters,
self.default_files, self.default_environment)
# Negative case2: created stack not in the list of available stacks
fake_stack = mock.Mock()
mock__create_stack.return_value = fake_stack
self.assertRaises(exceptions.RallyAssertionError,
stacks.CreateAndListStack(self.context).run,
template_path=self.default_template,
parameters=self.default_parameters,
files=self.default_files,
environment=self.default_environment)
mock__create_stack.assert_called_with(
self.default_template, self.default_parameters,
self.default_files, self.default_environment)
mock__list_stacks.assert_called_with()
@mock.patch("%s.ListStacksAndResources._list_stacks" % BASE)
def test_list_stack_and_resources(self, mock__list_stacks):
stack = mock.Mock()

View File

@@ -15,6 +15,7 @@
import mock
from rally import exceptions
from rally.plugins.openstack.scenarios.ironic import nodes
from tests.unit import test
@@ -23,8 +24,10 @@ class IronicNodesTestCase(test.ScenarioTestCase):
def test_create_and_list_node(self):
scenario = nodes.CreateAndListNode(self.context)
scenario._create_node = mock.Mock()
scenario._list_nodes = mock.Mock()
scenario._create_node = mock.Mock(return_value="node_obj1")
scenario._list_nodes = mock.Mock(return_value=["node_obj1",
"node_obj2",
"node_obj3"])
fake_params = {
"sort_dir": "foo1",
"associated": "foo2",
@@ -35,6 +38,8 @@ class IronicNodesTestCase(test.ScenarioTestCase):
"marker": "foo6",
"fake_parameter1": "foo7"
}
# Positive case:
scenario.run(**fake_params)
scenario._create_node.assert_called_once_with(fake_parameter1="foo7")
@@ -42,6 +47,25 @@ class IronicNodesTestCase(test.ScenarioTestCase):
sort_dir="foo1", associated="foo2", sort_key="foo3", detail=True,
limit="foo4", maintenance="foo5", marker="foo6")
# Negative case1: node isn't created
scenario._create_node = mock.Mock(return_value=None)
self.assertRaises(exceptions.RallyAssertionError,
scenario.run,
**fake_params)
scenario._create_node.assert_called_with(fake_parameter1="foo7")
# Negative case2: cretaed node not in the list of available nodes
scenario._create_node = mock.Mock()
self.assertRaises(exceptions.RallyAssertionError,
scenario.run,
**fake_params)
scenario._create_node.assert_called_with(fake_parameter1="foo7")
scenario._list_nodes.assert_called_with(
sort_dir="foo1", associated="foo2", sort_key="foo3", detail=True,
limit="foo4", maintenance="foo5", marker="foo6")
def test_create_and_delete_node(self):
fake_node = mock.Mock(uuid="fake_uuid")
scenario = nodes.CreateAndDeleteNode(self.context)

View File

@@ -129,7 +129,6 @@ class KeystoneBasicTestCase(test.ScenarioTestCase):
def test_create_and_list_tenants(self):
identity_service = self.mock_identity.return_value
scenario = basic.CreateAndListTenants(self.context)
scenario.run(enabled=True)
identity_service.create_project.assert_called_once_with(enabled=True)
identity_service.list_projects.assert_called_once_with()

View File

@@ -15,6 +15,7 @@
import ddt
import mock
from rally import exceptions
from rally.plugins.openstack.scenarios.magnum import clusters
from tests.unit import test
@@ -50,24 +51,60 @@ class MagnumClustersTestCase(test.ScenarioTestCase):
"fakearg": "f"}
fake_cluster = mock.Mock()
scenario._create_cluster = mock.Mock(return_value=fake_cluster)
scenario._list_clusters = mock.Mock()
scenario._list_clusters = mock.Mock(return_value=[fake_cluster,
mock.Mock(),
mock.Mock()])
# Positive case
scenario.run(2, **kwargs)
scenario._create_cluster.assert_called_once_with(
"existing_cluster_template_uuid", 2, **kwargs)
scenario._list_clusters.assert_called_once_with(**kwargs)
# Negative case1: cluster isn't created
scenario._create_cluster.return_value = None
self.assertRaises(exceptions.RallyAssertionError,
scenario.run, 2, **kwargs)
scenario._create_cluster.assert_called_with(
"existing_cluster_template_uuid", 2, **kwargs)
# Negative case2: created cluster not in the list of available clusters
scenario._create_cluster.return_value = mock.MagicMock()
self.assertRaises(exceptions.RallyAssertionError,
scenario.run, 2, **kwargs)
scenario._create_cluster.assert_called_with(
"existing_cluster_template_uuid", 2, **kwargs)
scenario._list_clusters.assert_called_with(**kwargs)
def test_create_and_list_clusters(self):
context = self._get_context()
scenario = clusters.CreateAndListClusters(context)
fake_cluster = mock.Mock()
kwargs = {"fakearg": "f"}
scenario._create_cluster = mock.Mock(return_value=fake_cluster)
scenario._list_clusters = mock.Mock()
scenario._list_clusters = mock.Mock(return_value=[fake_cluster,
mock.Mock(),
mock.Mock()])
# Positive case
scenario.run(2, **kwargs)
scenario._create_cluster.assert_called_once_with(
"rally_cluster_template_uuid", 2, **kwargs)
scenario._list_clusters.assert_called_once_with(**kwargs)
# Negative case1: cluster isn't created
scenario._create_cluster.return_value = None
self.assertRaises(exceptions.RallyAssertionError,
scenario.run, 2, **kwargs)
scenario._create_cluster.assert_called_with(
"rally_cluster_template_uuid", 2, **kwargs)
# Negative case2: created cluster not in the list of available clusters
scenario._create_cluster.return_value = mock.MagicMock()
self.assertRaises(exceptions.RallyAssertionError,
scenario.run, 2, **kwargs)
scenario._create_cluster.assert_called_with(
"rally_cluster_template_uuid", 2, **kwargs)
scenario._list_clusters.assert_called_with(**kwargs)

View File

@@ -106,8 +106,13 @@ class ManilaSharesTestCase(test.ScenarioTestCase):
)
def test_create_share_network_and_list(self, params):
scenario = shares.CreateShareNetworkAndList(self.context)
scenario._create_share_network = mock.MagicMock()
scenario._list_share_networks = mock.MagicMock()
fake_network = mock.Mock()
scenario._create_share_network = mock.Mock(
return_value=fake_network)
scenario._list_share_networks = mock.Mock(
return_value=[fake_network,
mock.Mock(),
mock.Mock()])
expected_create_params = {
"description": params.get("description"),
"neutron_net_id": params.get("neutron_net_id"),