Add Gnocchi archive policy scenarios

This patch is based on [1] and adds following scenarios:

GnocchiArchivePolicy.list_archive_policy
GnocchiArchivePolicy.create_archive_policy
GnocchiArchivePolicy.create_delete_archive_policy

[1] https://review.openstack.org/#/c/453861/

Change-Id: If9c0d0004b7ebb9f4eed49edfd2802884d18534f
Signed-off-by: Juha Kosonen <juha.kosonen@nokia.com>
This commit is contained in:
Juha Kosonen 2018-03-09 10:44:48 +02:00
parent 64f3a57c4c
commit cc829760d5
13 changed files with 326 additions and 7 deletions

View File

@ -64,3 +64,45 @@
sla:
failure_rate:
max: 0
GnocchiArchivePolicy.list_archive_policy:
-
runner:
type: "constant"
times: 10
concurrency: 2
context:
users:
tenants: 2
users_per_tenant: 3
sla:
failure_rate:
max: 0
GnocchiArchivePolicy.create_archive_policy:
-
args:
definition:
- granularity: "0:00:01"
timespan: "1:00:00"
runner:
type: "constant"
times: 10
concurrency: 2
sla:
failure_rate:
max: 0
GnocchiArchivePolicy.create_delete_archive_policy:
-
args:
definition:
- granularity: "0:00:01"
timespan: "1:00:00"
runner:
type: "constant"
times: 10
concurrency: 2
sla:
failure_rate:
max: 0

View File

@ -849,9 +849,7 @@ class IronicNodes(base.ResourceManager):
_gnocchi_order = get_order(1400)
@base.resource("gnocchi", "archive_policy_rule", order=next(_gnocchi_order),
admin_required=True, perform_for_admin_only=True)
class GnocchiArchivePolicyRule(base.ResourceManager):
class GnocchiMixin(base.ResourceManager):
def name(self):
return self.raw_resource["name"]
@ -860,6 +858,18 @@ class GnocchiArchivePolicyRule(base.ResourceManager):
return self.raw_resource["name"]
@base.resource("gnocchi", "archive_policy_rule", order=next(_gnocchi_order),
admin_required=True, perform_for_admin_only=True)
class GnocchiArchivePolicyRule(GnocchiMixin):
pass
@base.resource("gnocchi", "archive_policy", order=next(_gnocchi_order),
admin_required=True, perform_for_admin_only=True)
class GnocchiArchivePolicy(GnocchiMixin):
pass
# WATCHER
_watcher_order = get_order(1500)

View File

@ -0,0 +1,75 @@
# Copyright 2017 Red Hat, Inc. <http://www.redhat.com>
#
# 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 import consts
from rally.task import validation
from rally_openstack import scenario
from rally_openstack.scenarios.gnocchi import utils as gnocchiutils
"""Scenarios for Gnocchi archive policy."""
@validation.add("required_services", services=[consts.Service.GNOCCHI])
@validation.add("required_platform", platform="openstack", users=True)
@scenario.configure(name="GnocchiArchivePolicy.list_archive_policy")
class ListArchivePolicy(gnocchiutils.GnocchiBase):
def run(self):
"""List archive policies."""
self.gnocchi.list_archive_policy()
@validation.add("required_services", services=[consts.Service.GNOCCHI])
@validation.add("required_platform", platform="openstack", admin=True)
@scenario.configure(context={"admin_cleanup@openstack": ["gnocchi"]},
name="GnocchiArchivePolicy.create_archive_policy")
class CreateArchivePolicy(gnocchiutils.GnocchiBase):
def run(self, definition=None, aggregation_methods=None):
"""Create archive policy.
:param definition: List of definitions
:param aggregation_methods: List of aggregation methods
"""
if definition is None:
definition = [{"granularity": "0:00:01", "timespan": "1:00:00"}]
name = self.generate_random_name()
self.admin_gnocchi.create_archive_policy(
name, definition=definition,
aggregation_methods=aggregation_methods)
@validation.add("required_services", services=[consts.Service.GNOCCHI])
@validation.add("required_platform", platform="openstack", admin=True)
@scenario.configure(context={"admin_cleanup@openstack": ["gnocchi"]},
name="GnocchiArchivePolicy.create_delete_archive_policy")
class CreateDeleteArchivePolicy(gnocchiutils.GnocchiBase):
def run(self, definition=None, aggregation_methods=None):
"""Create archive policy and then delete it.
:param definition: List of definitions
:param aggregation_methods: List of aggregation methods
"""
if definition is None:
definition = [{"granularity": "0:00:01", "timespan": "1:00:00"}]
name = self.generate_random_name()
self.admin_gnocchi.create_archive_policy(
name, definition=definition,
aggregation_methods=aggregation_methods)
self.admin_gnocchi.delete_archive_policy(name)

View File

@ -28,8 +28,11 @@ class GnocchiService(service.Service):
:param aggregation_methods: Aggregation method of the archive policy
"""
archive_policy = {"name": name}
archive_policy["definition"] = definition
archive_policy["aggregation_methods"] = aggregation_methods
if definition is not None:
archive_policy["definition"] = definition
if aggregation_methods is not None:
archive_policy["aggregation_methods"] = aggregation_methods
return self._clients.gnocchi().archive_policy.create(
archive_policy)

View File

@ -0,0 +1,24 @@
{
"GnocchiArchivePolicy.create_archive_policy": [
{
"args": {
"definition": [
{
"granularity": "0:00:01",
"timespan": "1:00:00"
}
]
},
"runner": {
"type": "constant",
"times": 10,
"concurrency": 2
},
"sla": {
"failure_rate": {
"max": 0
}
}
}
]
}

View File

@ -0,0 +1,14 @@
---
GnocchiArchivePolicy.create_archive_policy:
-
args:
definition:
- granularity: "0:00:01"
timespan: "1:00:00"
runner:
type: "constant"
times: 10
concurrency: 2
sla:
failure_rate:
max: 0

View File

@ -0,0 +1,24 @@
{
"GnocchiArchivePolicy.create_delete_archive_policy": [
{
"args": {
"definition": [
{
"granularity": "0:00:01",
"timespan": "1:00:00"
}
]
},
"runner": {
"type": "constant",
"times": 10,
"concurrency": 2
},
"sla": {
"failure_rate": {
"max": 0
}
}
}
]
}

View File

@ -0,0 +1,14 @@
---
GnocchiArchivePolicy.create_delete_archive_policy:
-
args:
definition:
- granularity: "0:00:01"
timespan: "1:00:00"
runner:
type: "constant"
times: 10
concurrency: 2
sla:
failure_rate:
max: 0

View File

@ -0,0 +1,22 @@
{
"GnocchiArchivePolicy.list_archive_policy": [
{
"runner": {
"type": "constant",
"times": 10,
"concurrency": 2
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 3
}
},
"sla": {
"failure_rate": {
"max": 0
}
}
}
]
}

View File

@ -0,0 +1,14 @@
---
GnocchiArchivePolicy.list_archive_policy:
-
runner:
type: "constant"
times: 10
concurrency: 2
context:
users:
tenants: 2
users_per_tenant: 3
sla:
failure_rate:
max: 0

View File

@ -320,6 +320,9 @@ class Gnocchi(ResourceManager):
def list_archive_policy_rules(self):
return self.client.archive_policy_rule.list()
def list_archive_policy(self):
return self.client.archive_policy.list()
class Ironic(ResourceManager):

View File

@ -1102,10 +1102,10 @@ class CinderImageVolumeCacheTestCase(test.TestCase):
self.assertEqual("image-name", res.name())
class GnocchiArchivePolicyRuleTestCase(test.TestCase):
class GnocchiMixinTestCase(test.TestCase):
def get_gnocchi(self):
gnocchi = resources.GnocchiArchivePolicyRule()
gnocchi = resources.GnocchiMixin()
gnocchi._service = "gnocchi"
return gnocchi

View File

@ -0,0 +1,74 @@
# Copyright 2017 Red Hat, Inc. <http://www.redhat.com>
#
# 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_openstack.scenarios.gnocchi import archive_policy
from tests.unit import test
class GnocchiArchivePolicyTestCase(test.ScenarioTestCase):
def get_test_context(self):
context = super(GnocchiArchivePolicyTestCase,
self).get_test_context()
context.update({
"admin": {
"user_id": "fake",
"credential": mock.MagicMock()
},
"user": {
"user_id": "fake",
"credential": mock.MagicMock()
},
"tenant": {"id": "fake"}
})
return context
def setUp(self):
super(GnocchiArchivePolicyTestCase, self).setUp()
patch = mock.patch(
"rally_openstack.services.gnocchi.metric.GnocchiService")
self.addCleanup(patch.stop)
self.mock_metric = patch.start()
def test_list_archive_policy(self):
metric_service = self.mock_metric.return_value
scenario = archive_policy.ListArchivePolicy(self.context)
scenario.run()
metric_service.list_archive_policy.assert_called_once_with()
def test_create_archive_policy(self):
metric_service = self.mock_metric.return_value
scenario = archive_policy.CreateArchivePolicy(self.context)
scenario.generate_random_name = mock.MagicMock(return_value="name")
attrs = [{"foo": "1:23:24", "bar": "5:43:21"}]
aggreg = ["foo1", "foo2"]
scenario.run(definition=attrs, aggregation_methods=aggreg)
metric_service.create_archive_policy.assert_called_once_with(
"name", definition=attrs, aggregation_methods=aggreg)
def test_create_delete_archive_policy(self):
metric_service = self.mock_metric.return_value
scenario = archive_policy.CreateDeleteArchivePolicy(self.context)
scenario.generate_random_name = mock.MagicMock(return_value="name")
attrs = [{"foo": "2:34:55", "bar": "4:32:10"}]
aggreg = ["foo3", "foo4"]
scenario.run(definition=attrs, aggregation_methods=aggreg)
metric_service.create_archive_policy.assert_called_once_with(
"name", definition=attrs, aggregation_methods=aggreg)
metric_service.delete_archive_policy.assert_called_once_with(
"name")