From c89f810cece6391297e129d2f40edc95dd4ff5f2 Mon Sep 17 00:00:00 2001 From: Ryota MIBU Date: Wed, 9 Dec 2015 15:34:19 +0900 Subject: [PATCH] tempest: migrate codes from tempest tree Change-Id: I11dda00db7fc6b85947981ec19d757e686623d85 Implements: blueprint tempest-plugin --- aodh/tests/tempest/__init__.py | 0 aodh/tests/tempest/api/__init__.py | 0 aodh/tests/tempest/api/base.py | 62 ++++++++++++++++ aodh/tests/tempest/config.py | 40 +++++++++++ aodh/tests/tempest/service/__init__.py | 0 aodh/tests/tempest/service/client.py | 98 ++++++++++++++++++++++++++ 6 files changed, 200 insertions(+) create mode 100644 aodh/tests/tempest/__init__.py create mode 100644 aodh/tests/tempest/api/__init__.py create mode 100644 aodh/tests/tempest/api/base.py create mode 100644 aodh/tests/tempest/config.py create mode 100644 aodh/tests/tempest/service/__init__.py create mode 100644 aodh/tests/tempest/service/client.py diff --git a/aodh/tests/tempest/__init__.py b/aodh/tests/tempest/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/aodh/tests/tempest/api/__init__.py b/aodh/tests/tempest/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/aodh/tests/tempest/api/base.py b/aodh/tests/tempest/api/base.py new file mode 100644 index 00000000..53dd0940 --- /dev/null +++ b/aodh/tests/tempest/api/base.py @@ -0,0 +1,62 @@ +# 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 tempest_lib import exceptions as lib_exc + +from tempest.common.utils import data_utils +from tempest import config +import tempest.test + +CONF = config.CONF + + +class BaseAlarmingTest(tempest.test.BaseTestCase): + """Base test case class for all Alarming API tests.""" + + credentials = ['primary'] + + @classmethod + def skip_checks(cls): + super(BaseAlarmingTest, cls).skip_checks() + if not CONF.service_available.aodh: + raise cls.skipException("Aodh support is required") + + @classmethod + def setup_clients(cls): + super(BaseAlarmingTest, cls).setup_clients() + cls.alarming_client = cls.os.alarming_client + + @classmethod + def resource_setup(cls): + super(BaseAlarmingTest, cls).resource_setup() + cls.alarm_ids = [] + + @classmethod + def create_alarm(cls, **kwargs): + body = cls.alarming_client.create_alarm( + name=data_utils.rand_name('telemetry_alarm'), + type='threshold', **kwargs) + cls.alarm_ids.append(body['alarm_id']) + return body + + @staticmethod + def cleanup_resources(method, list_of_ids): + for resource_id in list_of_ids: + try: + method(resource_id) + except lib_exc.NotFound: + pass + + @classmethod + def resource_cleanup(cls): + cls.cleanup_resources(cls.alarming_client.delete_alarm, cls.alarm_ids) + super(BaseAlarmingTest, cls).resource_cleanup() diff --git a/aodh/tests/tempest/config.py b/aodh/tests/tempest/config.py new file mode 100644 index 00000000..438f07dc --- /dev/null +++ b/aodh/tests/tempest/config.py @@ -0,0 +1,40 @@ +# +# Copyright 2012 OpenStack Foundation +# +# 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 oslo_config import cfg + + +service_available_group = cfg.OptGroup(name="service_available", + title="Available OpenStack Services") + +ServiceAvailableGroup = [ + cfg.BoolOpt("aodh", + default=True, + help="Whether or not Aodh is expected to be available"), +] + +alarming_group = cfg.OptGroup(name='alarming', + title='Alarming Service Options') + +AlarmingGroup = [ + cfg.StrOpt('catalog_type', + default='alarming', + help="Catalog type of the Alarming service."), + cfg.StrOpt('endpoint_type', + default='publicURL', + choices=['public', 'admin', 'internal', + 'publicURL', 'adminURL', 'internalURL'], + help="The endpoint type to use for the alarming service."), +] diff --git a/aodh/tests/tempest/service/__init__.py b/aodh/tests/tempest/service/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/aodh/tests/tempest/service/client.py b/aodh/tests/tempest/service/client.py new file mode 100644 index 00000000..ce142119 --- /dev/null +++ b/aodh/tests/tempest/service/client.py @@ -0,0 +1,98 @@ +# Copyright 2014 OpenStack Foundation +# 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 oslo_serialization import jsonutils as json +from six.moves.urllib import parse as urllib + +from tempest.common import service_client + + +class AlarmingClient(service_client.ServiceClient): + + version = '2' + uri_prefix = "v2" + + def deserialize(self, body): + return json.loads(body.replace("\n", "")) + + def serialize(self, body): + return json.dumps(body) + + def list_alarms(self, query=None): + uri = '%s/alarms' % self.uri_prefix + uri_dict = {} + if query: + uri_dict = {'q.field': query[0], + 'q.op': query[1], + 'q.value': query[2]} + if uri_dict: + uri += "?%s" % urllib.urlencode(uri_dict) + resp, body = self.get(uri) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return service_client.ResponseBodyList(resp, body) + + def show_alarm(self, alarm_id): + uri = '%s/alarms/%s' % (self.uri_prefix, alarm_id) + resp, body = self.get(uri) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return service_client.ResponseBody(resp, body) + + def show_alarm_history(self, alarm_id): + uri = "%s/alarms/%s/history" % (self.uri_prefix, alarm_id) + resp, body = self.get(uri) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return service_client.ResponseBodyList(resp, body) + + def delete_alarm(self, alarm_id): + uri = "%s/alarms/%s" % (self.uri_prefix, alarm_id) + resp, body = self.delete(uri) + self.expected_success(204, resp.status) + if body: + body = self.deserialize(body) + return service_client.ResponseBody(resp, body) + + def create_alarm(self, **kwargs): + uri = "%s/alarms" % self.uri_prefix + body = self.serialize(kwargs) + resp, body = self.post(uri, body) + self.expected_success(201, resp.status) + body = self.deserialize(body) + return service_client.ResponseBody(resp, body) + + def update_alarm(self, alarm_id, **kwargs): + uri = "%s/alarms/%s" % (self.uri_prefix, alarm_id) + body = self.serialize(kwargs) + resp, body = self.put(uri, body) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return service_client.ResponseBody(resp, body) + + def show_alarm_state(self, alarm_id): + uri = "%s/alarms/%s/state" % (self.uri_prefix, alarm_id) + resp, body = self.get(uri) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return service_client.ResponseBodyData(resp, body) + + def alarm_set_state(self, alarm_id, state): + uri = "%s/alarms/%s/state" % (self.uri_prefix, alarm_id) + body = self.serialize(state) + resp, body = self.put(uri, body) + self.expected_success(200, resp.status) + body = self.deserialize(body) + return service_client.ResponseBodyData(resp, body)