[Ceilometer] Add scenario for events and traits

Add scenarios that cover all events and traits Ceilometer API

All scenarios create new user in keystone to store new Event in Ceilometer.
create_user_and_get_event checks GET /v2/events/<message_id>
create_user_and_list_events checks GET /v2/events
create_user_and_list_event_types checks GET /v2/event_types
create_user_and_list_traits checks
GET /v2/event_types/<event_type>/traits/<trait_name>
create_user_and_list_trait_description checks
GET /v2/event_types/<event_type>/traits

Change-Id: I572730d9f69e3d63b29eeedd03ddc24071ffca3d
This commit is contained in:
Igor Degtiarov 2015-06-09 15:14:39 +03:00
parent b86d1aaad9
commit e02f27060b
17 changed files with 538 additions and 0 deletions

View File

@ -305,6 +305,76 @@
failure_rate:
max: 0
CeilometerEvents.create_user_and_get_event:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0
CeilometerEvents.create_user_and_list_event_types:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0
CeilometerEvents.create_user_and_list_events:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0
CeilometerTraits.create_user_and_list_trait_descriptions:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0
CeilometerTraits.create_user_and_list_traits:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0
CeilometerMeters.list_meters:
-
runner:

View File

@ -0,0 +1,70 @@
# 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.
from rally.benchmark.scenarios import base
from rally.benchmark import validation
from rally import consts
from rally.plugins.openstack.scenarios.ceilometer import utils as cutils
from rally.plugins.openstack.scenarios.keystone import utils as kutils
class CeilometerEvents(cutils.CeilometerScenario, kutils.KeystoneScenario):
"""Benchmark scenarios for Ceilometer Events API."""
# NOTE(idegtiarov): to work with event we need to create it, there are
# no other way except emit suitable notification from one of services,
# for example create new user in keystone.
@validation.required_services(consts.Service.CEILOMETER,
consts.Service.KEYSTONE)
@validation.required_openstack(admin=True)
@base.scenario(context={"admin_cleanup": ["keystone"],
"cleanup": ["ceilometer"]})
def create_user_and_list_events(self):
"""Fetch all events.
This scenario creates user to store new event and
fetches list of all events using GET /v2/events.
"""
self._user_create()
self._list_events()
@validation.required_services(consts.Service.CEILOMETER,
consts.Service.KEYSTONE)
@validation.required_openstack(admin=True)
@base.scenario(context={"admin_cleanup": ["keystone"],
"cleanup": ["ceilometer"]})
def create_user_and_list_event_types(self):
"""Fetch all event types.
This scenario creates user to store new event and
fetches list of all events types using GET /v2/event_types.
"""
self._user_create()
self._list_event_types()
@validation.required_services(consts.Service.CEILOMETER,
consts.Service.KEYSTONE)
@validation.required_openstack(admin=True)
@base.scenario(context={"admin_cleanup": ["keystone"],
"cleanup": ["ceilometer"]})
def create_user_and_get_event(self):
"""Get event.
This scenario creates user to store new event and
fetches one event using GET /v2/events/<message_id>.
"""
self._user_create()
event = self._list_events()[0]
self._get_event(event_id=event.message_id)

View File

@ -0,0 +1,61 @@
# 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.
from rally.benchmark.scenarios import base
from rally.benchmark import validation
from rally import consts
from rally.plugins.openstack.scenarios.ceilometer import utils as cutils
from rally.plugins.openstack.scenarios.keystone import utils as kutils
class CeilometerTraits(cutils.CeilometerScenario, kutils.KeystoneScenario):
"""Benchmark scenarios for Ceilometer Events API."""
# NOTE(idegtiarov): to work with traits we need to create event firstly,
# there are no other way except emit suitable notification from one of
# services, for example create new user in keystone.
@validation.required_services(consts.Service.CEILOMETER,
consts.Service.KEYSTONE)
@validation.required_openstack(admin=True)
@base.scenario(context={"admin_cleanup": ["keystone"],
"cleanup": ["ceilometer"]})
def create_user_and_list_traits(self):
"""Fetch all events traits.
This scenario creates user to store new event and
fetches list of all traits for certain event type and
trait name using GET /v2/event_types/<event_type>/traits/<trait_name>.
"""
self._user_create()
event = self._list_events()[0]
trait_name = event.traits[0]["name"]
self._list_event_traits(event_type=event.event_type,
trait_name=trait_name)
@validation.required_services(consts.Service.CEILOMETER,
consts.Service.KEYSTONE)
@validation.required_openstack(admin=True)
@base.scenario(context={"admin_cleanup": ["keystone"],
"cleanup": ["ceilometer"]})
def create_user_and_list_trait_descriptions(self):
"""Fetch all trait descriptions.
This scenario creates user to store new event and
fetches list of all traits for certain event type using
GET /v2/event_types/<event_type>/traits.
"""
self._user_create()
event = self._list_events()[0]
self._list_event_trait_descriptions(event_type=event.event_type)

View File

@ -117,6 +117,55 @@ class CeilometerScenario(base.Scenario):
.get_from_manager(),
timeout=timeout, check_interval=1)
@base.atomic_action_timer("ceilometer.list_events")
def _list_events(self):
"""Get list of user's events.
It fetches all events.
:returns: list of events
"""
return self.admin_clients("ceilometer").events.list()
@base.atomic_action_timer("ceilometer.get_event")
def _get_event(self, event_id):
"""Get event with specific id.
Get event matching event_id.
:param event_id: specifies id of the event
:returns: event
"""
return self.admin_clients("ceilometer").events.get(event_id)
@base.atomic_action_timer("ceilometer.list_event_types")
def _list_event_types(self):
"""Get list of all event types.
:returns: list of event types
"""
return self.admin_clients("ceilometer").event_types.list()
@base.atomic_action_timer("ceilometer.list_event_traits")
def _list_event_traits(self, event_type, trait_name):
"""Get list of event traits.
:param event_type: specifies the type of event
:param trait_name: specifies trait name
:returns: list of event traits
"""
return self.admin_clients("ceilometer").traits.list(event_type,
trait_name)
@base.atomic_action_timer("ceilometer.list_event_trait_descriptions")
def _list_event_trait_descriptions(self, event_type):
"""Get list of event trait descriptions.
:param event_type: specifies the type of event
:returns: list of event trait descriptions
"""
return self.admin_clients("ceilometer").trait_descriptions.list(
event_type)
@base.atomic_action_timer("ceilometer.list_meters")
def _list_meters(self):
"""Get list of user's meters."""

View File

@ -0,0 +1,17 @@
{
"CeilometerEvents.create_user_and_get_event": [
{
"runner": {
"type": "constant",
"times": 10,
"concurrency": 10
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 2
}
}
}
]
}

View File

@ -0,0 +1,11 @@
---
CeilometerEvents.create_user_and_get_event:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2

View File

@ -0,0 +1,17 @@
{
"CeilometerEvents.create_user_and_list_event_types": [
{
"runner": {
"type": "constant",
"times": 10,
"concurrency": 10
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 2
}
}
}
]
}

View File

@ -0,0 +1,11 @@
---
CeilometerEvents.create_user_and_list_event_types:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2

View File

@ -0,0 +1,17 @@
{
"CeilometerEvents.create_user_and_list_events": [
{
"runner": {
"type": "constant",
"times": 10,
"concurrency": 10
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 2
}
}
}
]
}

View File

@ -0,0 +1,11 @@
---
CeilometerEvents.create_user_and_list_events:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2

View File

@ -0,0 +1,17 @@
{
"CeilometerTraits.create_user_and_list_trait_descriptions": [
{
"runner": {
"type": "constant",
"times": 10,
"concurrency": 10
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 2
}
}
}
]
}

View File

@ -0,0 +1,11 @@
---
CeilometerTraits.create_user_and_list_trait_descriptions:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2

View File

@ -0,0 +1,17 @@
{
"CeilometerTraits.create_user_and_list_traits": [
{
"runner": {
"type": "constant",
"times": 10,
"concurrency": 10
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 2
}
}
}
]
}

View File

@ -0,0 +1,11 @@
---
CeilometerTraits.create_user_and_list_traits:
-
runner:
type: "constant"
times: 10
concurrency: 10
context:
users:
tenants: 2
users_per_tenant: 2

View File

@ -0,0 +1,51 @@
# 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 mock
from rally.plugins.openstack.scenarios.ceilometer import events
from tests.unit import test
class CeilometerEventsTestCase(test.TestCase):
def test_list_events(self):
scenario = events.CeilometerEvents()
scenario._user_create = mock.MagicMock()
scenario._list_events = mock.MagicMock()
scenario.create_user_and_list_events()
scenario._user_create.assert_called_once_with()
scenario._list_events.assert_called_once_with()
def test_list_event_types(self):
scenario = events.CeilometerEvents()
scenario._list_event_types = mock.MagicMock()
scenario._user_create = mock.MagicMock()
scenario.create_user_and_list_event_types()
scenario._user_create.assert_called_once_with()
scenario._list_event_types.assert_called_once_with()
def test_get_event(self):
scenario = events.CeilometerEvents()
scenario._user_create = mock.MagicMock()
scenario._list_events = mock.MagicMock()
scenario._get_event = mock.MagicMock()
scenario._list_events.return_value = [mock.Mock(message_id="fake_id")]
scenario.create_user_and_get_event()
scenario._user_create.assert_called_once_with()
scenario._list_events.assert_called_with()
scenario._get_event.assert_called_with(event_id="fake_id")

View File

@ -0,0 +1,52 @@
# 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 mock
from rally.plugins.openstack.scenarios.ceilometer import traits
from tests.unit import test
class CeilometerTraitsTestCase(test.TestCase):
def test_list_traits(self):
scenario = traits.CeilometerTraits()
scenario._user_create = mock.MagicMock()
scenario._list_events = mock.MagicMock()
scenario._list_event_traits = mock.MagicMock()
scenario._list_events.return_value = [mock.Mock(
event_type="fake_event_type",
traits=[{"name": "fake_trait_name"}])
]
scenario.create_user_and_list_traits()
scenario._user_create.assert_called_once_with()
scenario._list_events.assert_called_with()
scenario._list_event_traits.assert_called_once_with(
event_type="fake_event_type", trait_name="fake_trait_name")
def test_list_trait_descriptions(self):
scenario = traits.CeilometerTraits()
scenario._user_create = mock.MagicMock()
scenario._list_events = mock.MagicMock()
scenario._list_event_trait_descriptions = mock.MagicMock()
scenario._list_events.return_value = [mock.Mock(
event_type="fake_event_type")
]
scenario.create_user_and_list_trait_descriptions()
scenario._user_create.assert_called_once_with()
scenario._list_events.assert_called_with()
scenario._list_event_trait_descriptions.assert_called_once_with(
event_type="fake_event_type")

View File

@ -122,6 +122,51 @@ class CeilometerScenarioTestCase(test.ClientsTestCase):
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"ceilometer.set_alarm_state")
def test__list_events(self):
self.assertEqual(
self.scenario._list_events(),
self.admin_clients("ceilometer").events.list.return_value
)
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"ceilometer.list_events")
def test__get_events(self):
self.assertEqual(
self.scenario._get_event(event_id="fake_id"),
self.admin_clients("ceilometer").events.get.return_value
)
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"ceilometer.get_event")
def test__list_event_types(self):
self.assertEqual(
self.scenario._list_event_types(),
self.admin_clients("ceilometer").event_types.list.return_value
)
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"ceilometer.list_event_types")
def test__list_event_traits(self):
self.assertEqual(
self.scenario._list_event_traits(
event_type="fake_event_type", trait_name="fake_trait_name"),
self.admin_clients("ceilometer").traits.list.return_value
)
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"ceilometer.list_event_traits")
def test__list_event_trait_descriptions(self):
self.assertEqual(
self.scenario._list_event_trait_descriptions(
event_type="fake_event_type"
),
self.admin_clients("ceilometer").trait_descriptions.list.
return_value
)
self._test_atomic_action_timer(
self.scenario.atomic_actions(),
"ceilometer.list_event_trait_descriptions")
def test__list_meters(self):
self.assertEqual(self.scenario._list_meters(),
self.clients("ceilometer").meters.list.return_value)