From 93ab24b7ea768c5285b4c812d0f6d08d3575f23b Mon Sep 17 00:00:00 2001 From: tengqm Date: Fri, 3 Jun 2016 04:55:35 -0400 Subject: [PATCH] Relocate alarm service into a submodule This patch moves the resources of the alarm service (aodh) into a submodule of the telemetry, as a service that can be addressed using 'alarm' as service type. Change-Id: I0c2521443225e41b4090ee7ecb5f095072b1fc95 --- openstack/profile.py | 12 +- openstack/service_filter.py | 2 +- openstack/telemetry/alarm/__init__.py | 0 openstack/telemetry/alarm/alarm_service.py | 24 ++++ openstack/telemetry/alarm/v2/__init__.py | 0 openstack/telemetry/alarm/v2/_proxy.py | 129 ++++++++++++++++++ openstack/telemetry/{ => alarm}/v2/alarm.py | 11 +- .../telemetry/{ => alarm}/v2/alarm_change.py | 5 +- openstack/telemetry/v2/_proxy.py | 108 --------------- .../functional/telemetry/alarm/__init__.py | 0 .../functional/telemetry/alarm/v2/__init__.py | 0 .../telemetry/{ => alarm}/v2/test_alarm.py | 12 +- .../{ => alarm}/v2/test_alarm_change.py | 8 +- .../tests/unit/telemetry/alarm/__init__.py | 0 .../telemetry/alarm/test_alarm_service.py | 28 ++++ .../tests/unit/telemetry/alarm/v2/__init__.py | 0 .../telemetry/{ => alarm}/v2/test_alarm.py | 20 +-- .../{ => alarm}/v2/test_alarm_change.py | 4 +- .../unit/telemetry/alarm/v2/test_proxy.py | 54 ++++++++ .../tests/unit/telemetry/v2/test_proxy.py | 34 ----- openstack/tests/unit/test_connection.py | 2 + openstack/tests/unit/test_profile.py | 7 +- 22 files changed, 284 insertions(+), 176 deletions(-) create mode 100644 openstack/telemetry/alarm/__init__.py create mode 100644 openstack/telemetry/alarm/alarm_service.py create mode 100644 openstack/telemetry/alarm/v2/__init__.py create mode 100644 openstack/telemetry/alarm/v2/_proxy.py rename openstack/telemetry/{ => alarm}/v2/alarm.py (90%) rename openstack/telemetry/{ => alarm}/v2/alarm_change.py (93%) create mode 100644 openstack/tests/functional/telemetry/alarm/__init__.py create mode 100644 openstack/tests/functional/telemetry/alarm/v2/__init__.py rename openstack/tests/functional/telemetry/{ => alarm}/v2/test_alarm.py (79%) rename openstack/tests/functional/telemetry/{ => alarm}/v2/test_alarm_change.py (82%) create mode 100644 openstack/tests/unit/telemetry/alarm/__init__.py create mode 100644 openstack/tests/unit/telemetry/alarm/test_alarm_service.py create mode 100644 openstack/tests/unit/telemetry/alarm/v2/__init__.py rename openstack/tests/unit/telemetry/{ => alarm}/v2/test_alarm.py (89%) rename openstack/tests/unit/telemetry/{ => alarm}/v2/test_alarm_change.py (95%) create mode 100644 openstack/tests/unit/telemetry/alarm/v2/test_proxy.py diff --git a/openstack/profile.py b/openstack/profile.py index 534b03d2..79ca3d38 100644 --- a/openstack/profile.py +++ b/openstack/profile.py @@ -68,6 +68,7 @@ from openstack import module_loader from openstack.network import network_service from openstack.object_store import object_store_service from openstack.orchestration import orchestration_service +from openstack.telemetry.alarm import alarm_service from openstack.telemetry import telemetry_service _logger = logging.getLogger(__name__) @@ -89,23 +90,22 @@ class Profile(object): 'compute', etc. """ self._services = {} + + self._add_service(alarm_service.AlarmService(version="v2")) + self._add_service(block_store_service.BlockStoreService(version="v2")) self._add_service(cluster_service.ClusterService(version="v1")) self._add_service(compute_service.ComputeService(version="v2")) self._add_service(database_service.DatabaseService(version="v1")) self._add_service(identity_service.IdentityService(version="v3")) self._add_service(image_service.ImageService(version="v2")) + self._add_service(key_manager_service.KeyManagerService(version="v1")) + self._add_service(message_service.MessageService(version="v1")) self._add_service(network_service.NetworkService(version="v2")) self._add_service( object_store_service.ObjectStoreService(version="v1")) self._add_service( orchestration_service.OrchestrationService(version="v1")) - self._add_service(key_manager_service.KeyManagerService(version="v1")) self._add_service(telemetry_service.TelemetryService(version="v1")) - self._add_service(block_store_service.BlockStoreService(version="v2")) - self._add_service(message_service.MessageService(version="v1")) - - # NOTE: The Metric service is not added here as it currently - # only retrieves the /capabilities API. if plugins: for plugin in plugins: diff --git a/openstack/service_filter.py b/openstack/service_filter.py index fdb54ba1..95bc2aa1 100644 --- a/openstack/service_filter.py +++ b/openstack/service_filter.py @@ -188,4 +188,4 @@ class ServiceFilter(dict): object store where the service type is `object-store` and the module is `object_store`. """ - return self.__class__.__module__.split('.')[1] + return self.__class__.__module__.split('.')[-2] diff --git a/openstack/telemetry/alarm/__init__.py b/openstack/telemetry/alarm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/telemetry/alarm/alarm_service.py b/openstack/telemetry/alarm/alarm_service.py new file mode 100644 index 00000000..a23cc3a6 --- /dev/null +++ b/openstack/telemetry/alarm/alarm_service.py @@ -0,0 +1,24 @@ +# 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 openstack import service_filter + + +class AlarmService(service_filter.ServiceFilter): + """The alarm service.""" + + valid_versions = [service_filter.ValidVersion('v2')] + + def __init__(self, version=None): + """Create an alarm service.""" + super(AlarmService, self).__init__(service_type='alarming', + version=version) diff --git a/openstack/telemetry/alarm/v2/__init__.py b/openstack/telemetry/alarm/v2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/telemetry/alarm/v2/_proxy.py b/openstack/telemetry/alarm/v2/_proxy.py new file mode 100644 index 00000000..abadcd26 --- /dev/null +++ b/openstack/telemetry/alarm/v2/_proxy.py @@ -0,0 +1,129 @@ +# 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 openstack import proxy +from openstack.telemetry.alarm.v2 import alarm as _alarm +from openstack.telemetry.alarm.v2 import alarm_change as _alarm_change + + +class Proxy(proxy.BaseProxy): + """.. caution:: This API is a work in progress and is subject to change.""" + + def create_alarm(self, **attrs): + """Create a new alarm from attributes + + :param dict attrs: Keyword arguments which will be used to create + a :class:`~openstack.telemetry.v2.alarm.Alarm`, + comprised of the properties on the Alarm class. + + :returns: The results of alarm creation + :rtype: :class:`~openstack.telemetry.v2.alarm.Alarm` + """ + return self._create(_alarm.Alarm, **attrs) + + def delete_alarm(self, alarm, ignore_missing=True): + """Delete an alarm + + :param alarm: The value can be either the ID of an alarm or a + :class:`~openstack.telemetry.v2.alarm.Alarm` instance. + :param bool ignore_missing: When set to ``False`` + :class:`~openstack.exceptions.ResourceNotFound` will be + raised when the alarm does not exist. + When set to ``True``, no exception will be set when + attempting to delete a nonexistent alarm. + + :returns: ``None`` + """ + self._delete(_alarm.Alarm, alarm, ignore_missing=ignore_missing) + + def find_alarm(self, name_or_id, ignore_missing=True): + """Find a single alarm + + :param name_or_id: The name or ID of a alarm. + :param bool ignore_missing: When set to ``False`` + :class:`~openstack.exceptions.ResourceNotFound` will be + raised when the resource does not exist. + When set to ``True``, None will be returned when + attempting to find a nonexistent resource. + :returns: One :class:`~openstack.telemetry.v2.alarm.Alarm` or None + """ + return self._find(_alarm.Alarm, name_or_id, + ignore_missing=ignore_missing) + + def get_alarm(self, alarm): + """Get a single alarm + + :param alarm: The value can be the ID of an alarm or a + :class:`~openstack.telemetry.v2.alarm.Alarm` instance. + + :returns: One :class:`~openstack.telemetry.v2.alarm.Alarm` + :raises: :class:`~openstack.exceptions.ResourceNotFound` + when no resource can be found. + """ + return self._get(_alarm.Alarm, alarm) + + def alarms(self, **query): + """Return a generator of alarms + + :param kwargs \*\*query: Optional query parameters to be sent to limit + the resources being returned. + + :returns: A generator of alarm objects + :rtype: :class:`~openstack.telemetry.v2.alarm.Alarm` + """ + # TODO(Qiming): Check the alarm service API docs/code to verify if + # the parameters need a change. + return self._list(_alarm.Alarm, paginated=False, **query) + + def update_alarm(self, alarm, **attrs): + """Update a alarm + + :param alarm: Either the id of a alarm or a + :class:`~openstack.telemetry.v2.alarm.Alarm` instance. + :attrs kwargs: The attributes to update on the alarm represented + by ``value``. + + :returns: The updated alarm + :rtype: :class:`~openstack.telemetry.v2.alarm.Alarm` + """ + return self._update(_alarm.Alarm, alarm, **attrs) + + def find_alarm_change(self, name_or_id, ignore_missing=True): + """Find a single alarm change + + :param name_or_id: The name or ID of a alarm change. + :param bool ignore_missing: When set to ``False`` + :class:`~openstack.exceptions.ResourceNotFound` will be + raised when the resource does not exist. + When set to ``True``, None will be returned when + attempting to find a nonexistent resource. + :returns: One :class:`~openstack.telemetry.v2.alarm_change.AlarmChange` + or None + """ + return self._find(_alarm_change.AlarmChange, name_or_id, + ignore_missing=ignore_missing) + + def alarm_changes(self, alarm, **query): + """Return a generator of alarm changes + + :param alarm: Alarm resource or id for alarm. + :param kwargs \*\*query: Optional query parameters to be sent to limit + the resources being returned. + + :returns: A generator of alarm change objects + :rtype: :class:`~openstack.telemetry.v2.alarm_change.AlarmChange` + """ + # TODO(Qiming): Check the alarm service API docs/code to verify if + # the parameters need a change. + alarm_id = _alarm.Alarm.from_id(alarm).id + return self._list(_alarm_change.AlarmChange, paginated=False, + path_args={'alarm_id': alarm_id}, **query) diff --git a/openstack/telemetry/v2/alarm.py b/openstack/telemetry/alarm/v2/alarm.py similarity index 90% rename from openstack/telemetry/v2/alarm.py rename to openstack/telemetry/alarm/v2/alarm.py index 25364716..095d44ab 100644 --- a/openstack/telemetry/v2/alarm.py +++ b/openstack/telemetry/alarm/v2/alarm.py @@ -11,7 +11,7 @@ # under the License. from openstack import resource -from openstack.telemetry import telemetry_service +from openstack.telemetry.alarm import alarm_service from openstack import utils @@ -19,7 +19,7 @@ class Alarm(resource.Resource): """.. caution:: This API is a work in progress and is subject to change.""" id_attribute = 'alarm_id' base_path = '/alarms' - service = telemetry_service.TelemetryService() + service = alarm_service.AlarmService() # Supported Operations allow_create = True @@ -55,6 +55,7 @@ class Alarm(resource.Resource): #: The state off the alarm state = resource.prop('state') #: The timestamp of the last alarm state change. + #: *Type: ISO 8601 formatted string* state_changed_at = resource.prop('state_timestamp') # TODO(briancurtin): undocumented threshold_rule = resource.prop('threshold_rule', type=dict) @@ -63,6 +64,7 @@ class Alarm(resource.Resource): #: Explicit type specifier to select which rule to follow type = resource.prop('type') #: The timestamp of the last alarm definition update. + #: *Type: ISO 8601 formatted string* updated_at = resource.prop('timestamp') #: The ID of the user who created the alarm user_id = resource.prop('user_id') @@ -70,7 +72,8 @@ class Alarm(resource.Resource): def change_state(self, session, next_state): """Set the state of an alarm. - The next_state may be one of: 'ok' 'insufficient data' 'alarm' + :param next_state: The valid values can be one of: ``ok``, ``alarm``, + ``insufficient data``. """ url = utils.urljoin(self.base_path, self.id, 'state') resp = session.put(url, endpoint_filter=self.service, json=next_state) @@ -79,7 +82,7 @@ class Alarm(resource.Resource): def check_state(self, session): """Retrieve the current state of an alarm from the service. - The properties of the alarm are not modified. + The properties of the alarm are not modified. """ url = utils.urljoin(self.base_path, self.id, 'state') resp = session.get(url, endpoint_filter=self.service) diff --git a/openstack/telemetry/v2/alarm_change.py b/openstack/telemetry/alarm/v2/alarm_change.py similarity index 93% rename from openstack/telemetry/v2/alarm_change.py rename to openstack/telemetry/alarm/v2/alarm_change.py index 42a56171..ecc3e42d 100644 --- a/openstack/telemetry/v2/alarm_change.py +++ b/openstack/telemetry/alarm/v2/alarm_change.py @@ -11,7 +11,7 @@ # under the License. from openstack import resource -from openstack.telemetry import telemetry_service +from openstack.telemetry.alarm import alarm_service class AlarmChange(resource.Resource): @@ -19,7 +19,7 @@ class AlarmChange(resource.Resource): id_attribute = 'event_id' resource_key = 'alarm_change' base_path = '/alarms/%(alarm_id)s/history' - service = telemetry_service.TelemetryService() + service = alarm_service.AlarmService() # Supported Operations allow_list = True @@ -36,6 +36,7 @@ class AlarmChange(resource.Resource): #: The project ID of the initiating identity project_id = resource.prop('project_id') #: The time/date of the alarm change. + #: *Type: ISO 8601 formatted string* triggered_at = resource.prop('timestamp') #: The type of change type = resource.prop('type') diff --git a/openstack/telemetry/v2/_proxy.py b/openstack/telemetry/v2/_proxy.py index 2a1fa8c2..7114fbdd 100644 --- a/openstack/telemetry/v2/_proxy.py +++ b/openstack/telemetry/v2/_proxy.py @@ -11,8 +11,6 @@ # under the License. from openstack import proxy -from openstack.telemetry.v2 import alarm as _alarm -from openstack.telemetry.v2 import alarm_change as _alarm_change from openstack.telemetry.v2 import capability from openstack.telemetry.v2 import meter as _meter from openstack.telemetry.v2 import resource as _resource @@ -23,112 +21,6 @@ from openstack.telemetry.v2 import statistics class Proxy(proxy.BaseProxy): """.. caution:: This API is a work in progress and is subject to change.""" - def create_alarm(self, **attrs): - """Create a new alarm from attributes - - :param dict attrs: Keyword arguments which will be used to create - a :class:`~openstack.telemetry.v2.alarm.Alarm`, - comprised of the properties on the Alarm class. - - :returns: The results of alarm creation - :rtype: :class:`~openstack.telemetry.v2.alarm.Alarm` - """ - return self._create(_alarm.Alarm, **attrs) - - def delete_alarm(self, alarm, ignore_missing=True): - """Delete an alarm - - :param alarm: The value can be either the ID of an alarm or a - :class:`~openstack.telemetry.v2.alarm.Alarm` instance. - :param bool ignore_missing: When set to ``False`` - :class:`~openstack.exceptions.ResourceNotFound` will be - raised when the alarm does not exist. - When set to ``True``, no exception will be set when - attempting to delete a nonexistent alarm. - - :returns: ``None`` - """ - self._delete(_alarm.Alarm, alarm, ignore_missing=ignore_missing) - - def find_alarm(self, name_or_id, ignore_missing=True): - """Find a single alarm - - :param name_or_id: The name or ID of a alarm. - :param bool ignore_missing: When set to ``False`` - :class:`~openstack.exceptions.ResourceNotFound` will be - raised when the resource does not exist. - When set to ``True``, None will be returned when - attempting to find a nonexistent resource. - :returns: One :class:`~openstack.telemetry.v2.alarm.Alarm` or None - """ - return self._find(_alarm.Alarm, name_or_id, - ignore_missing=ignore_missing) - - def get_alarm(self, alarm): - """Get a single alarm - - :param alarm: The value can be the ID of an alarm or a - :class:`~openstack.telemetry.v2.alarm.Alarm` instance. - - :returns: One :class:`~openstack.telemetry.v2.alarm.Alarm` - :raises: :class:`~openstack.exceptions.ResourceNotFound` - when no resource can be found. - """ - return self._get(_alarm.Alarm, alarm) - - def alarms(self, **query): - """Return a generator of alarms - - :param kwargs \*\*query: Optional query parameters to be sent to limit - the resources being returned. - - :returns: A generator of alarm objects - :rtype: :class:`~openstack.telemetry.v2.alarm.Alarm` - """ - return self._list(_alarm.Alarm, paginated=False, **query) - - def update_alarm(self, alarm, **attrs): - """Update a alarm - - :param alarm: Either the id of a alarm or a - :class:`~openstack.telemetry.v2.alarm.Alarm` instance. - :attrs kwargs: The attributes to update on the alarm represented - by ``value``. - - :returns: The updated alarm - :rtype: :class:`~openstack.telemetry.v2.alarm.Alarm` - """ - return self._update(_alarm.Alarm, alarm, **attrs) - - def find_alarm_change(self, name_or_id, ignore_missing=True): - """Find a single alarm change - - :param name_or_id: The name or ID of a alarm change. - :param bool ignore_missing: When set to ``False`` - :class:`~openstack.exceptions.ResourceNotFound` will be - raised when the resource does not exist. - When set to ``True``, None will be returned when - attempting to find a nonexistent resource. - :returns: One :class:`~openstack.telemetry.v2.alarm_change.AlarmChange` - or None - """ - return self._find(_alarm_change.AlarmChange, name_or_id, - ignore_missing=ignore_missing) - - def alarm_changes(self, alarm, **query): - """Return a generator of alarm changes - - :param alarm: Alarm resource or id for alarm. - :param kwargs \*\*query: Optional query parameters to be sent to limit - the resources being returned. - - :returns: A generator of alarm change objects - :rtype: :class:`~openstack.telemetry.v2.alarm_change.AlarmChange` - """ - alarm_id = _alarm.Alarm.from_id(alarm).id - return self._list(_alarm_change.AlarmChange, paginated=False, - path_args={'alarm_id': alarm_id}, **query) - def find_capability(self, name_or_id, ignore_missing=True): """Find a single capability diff --git a/openstack/tests/functional/telemetry/alarm/__init__.py b/openstack/tests/functional/telemetry/alarm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/tests/functional/telemetry/alarm/v2/__init__.py b/openstack/tests/functional/telemetry/alarm/v2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/tests/functional/telemetry/v2/test_alarm.py b/openstack/tests/functional/telemetry/alarm/v2/test_alarm.py similarity index 79% rename from openstack/tests/functional/telemetry/v2/test_alarm.py rename to openstack/tests/functional/telemetry/alarm/v2/test_alarm.py index b678a0b7..3c6c0dd9 100644 --- a/openstack/tests/functional/telemetry/v2/test_alarm.py +++ b/openstack/tests/functional/telemetry/alarm/v2/test_alarm.py @@ -13,11 +13,13 @@ import unittest import uuid -from openstack.telemetry.v2 import alarm +from openstack.telemetry.alarm.v2 import alarm from openstack.tests.functional import base @unittest.skip("bug/1524468") +@unittest.skipUnless(base.service_exists(service_type="alarming"), + "Alarming service does not exist") @unittest.skipUnless(base.service_exists(service_type="metering"), "Metering service does not exist") class TestAlarm(base.BaseFunctionalTest): @@ -29,7 +31,7 @@ class TestAlarm(base.BaseFunctionalTest): def setUpClass(cls): super(TestAlarm, cls).setUpClass() meter = next(cls.conn.telemetry.meters()) - sot = cls.conn.telemetry.create_alarm( + sot = cls.conn.alarm.create_alarm( name=cls.NAME, type='threshold', threshold_rule={ @@ -43,14 +45,14 @@ class TestAlarm(base.BaseFunctionalTest): @classmethod def tearDownClass(cls): - sot = cls.conn.telemetry.delete_alarm(cls.ID, ignore_missing=False) + sot = cls.conn.alarm.delete_alarm(cls.ID, ignore_missing=False) cls.assertIs(None, sot) def test_get(self): - sot = self.conn.telemetry.get_alarm(self.ID) + sot = self.conn.alarm.get_alarm(self.ID) self.assertEqual(self.NAME, sot.name) self.assertEqual(self.ID, sot.id) def test_list(self): - names = [o.name for o in self.conn.telemetry.alarms()] + names = [o.name for o in self.conn.alarm.alarms()] self.assertIn(self.NAME, names) diff --git a/openstack/tests/functional/telemetry/v2/test_alarm_change.py b/openstack/tests/functional/telemetry/alarm/v2/test_alarm_change.py similarity index 82% rename from openstack/tests/functional/telemetry/v2/test_alarm_change.py rename to openstack/tests/functional/telemetry/alarm/v2/test_alarm_change.py index 185ebe91..f1b94d41 100644 --- a/openstack/tests/functional/telemetry/v2/test_alarm_change.py +++ b/openstack/tests/functional/telemetry/alarm/v2/test_alarm_change.py @@ -19,6 +19,8 @@ from openstack.tests.functional import base @unittest.skip("bug/1524468") @unittest.skipUnless(base.service_exists(service_type="metering"), "Metering service does not exist") +@unittest.skipUnless(base.service_exists(service_type="alarming"), + "Alarming service does not exist") class TestAlarmChange(base.BaseFunctionalTest): NAME = uuid.uuid4().hex @@ -28,7 +30,7 @@ class TestAlarmChange(base.BaseFunctionalTest): def setUpClass(cls): super(TestAlarmChange, cls).setUpClass() meter = next(cls.conn.telemetry.meters()) - alarm = cls.conn.telemetry.create_alarm( + alarm = cls.conn.alarm.create_alarm( name=cls.NAME, type='threshold', threshold_rule={ @@ -40,9 +42,9 @@ class TestAlarmChange(base.BaseFunctionalTest): @classmethod def tearDownClass(cls): - cls.conn.telemetry.delete_alarm(cls.alarm, ignore_missing=False) + cls.conn.alarm.delete_alarm(cls.alarm, ignore_missing=False) def test_list(self): - change = next(self.conn.telemetry.alarm_changes(self.alarm)) + change = next(self.conn.alarm.alarm_changes(self.alarm)) self.assertEqual(self.alarm.id, change.alarm_id) self.assertEqual('creation', change.type) diff --git a/openstack/tests/unit/telemetry/alarm/__init__.py b/openstack/tests/unit/telemetry/alarm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/tests/unit/telemetry/alarm/test_alarm_service.py b/openstack/tests/unit/telemetry/alarm/test_alarm_service.py new file mode 100644 index 00000000..8106e961 --- /dev/null +++ b/openstack/tests/unit/telemetry/alarm/test_alarm_service.py @@ -0,0 +1,28 @@ +# 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 testtools + +from openstack.telemetry.alarm import alarm_service + + +class TestAlarmService(testtools.TestCase): + + def test_service(self): + sot = alarm_service.AlarmService() + self.assertEqual('alarming', sot.service_type) + self.assertEqual('public', sot.interface) + self.assertIsNone(sot.region) + self.assertIsNone(sot.service_name) + self.assertEqual(1, len(sot.valid_versions)) + self.assertEqual('v2', sot.valid_versions[0].module) + self.assertEqual('v2', sot.valid_versions[0].path) diff --git a/openstack/tests/unit/telemetry/alarm/v2/__init__.py b/openstack/tests/unit/telemetry/alarm/v2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstack/tests/unit/telemetry/v2/test_alarm.py b/openstack/tests/unit/telemetry/alarm/v2/test_alarm.py similarity index 89% rename from openstack/tests/unit/telemetry/v2/test_alarm.py rename to openstack/tests/unit/telemetry/alarm/v2/test_alarm.py index 08a92b98..cd0cb1af 100644 --- a/openstack/tests/unit/telemetry/v2/test_alarm.py +++ b/openstack/tests/unit/telemetry/alarm/v2/test_alarm.py @@ -13,7 +13,7 @@ import mock import testtools -from openstack.telemetry.v2 import alarm +from openstack.telemetry.alarm.v2 import alarm IDENTIFIER = 'IDENTIFIER' EXAMPLE = { @@ -31,13 +31,15 @@ EXAMPLE = { 'state': 'insufficient data', 'state_timestamp': '2015-03-09T12:15:57.233772', 'timestamp': '2015-03-09T12:15:57.233772', - 'threshold_rule': {'meter_name': 'a', - 'evaluation_periods:': '1', - 'period': '60', - 'statistic': 'avg', - 'threshold': '92.6', - 'comparison_operator': 'gt', - 'exclude_outliers': True, }, + 'threshold_rule': { + 'meter_name': 'a', + 'evaluation_periods:': '1', + 'period': '60', + 'statistic': 'avg', + 'threshold': '92.6', + 'comparison_operator': 'gt', + 'exclude_outliers': True, + }, 'time_constraints': [{'name': 'a', 'duration': 'b', 'start': 'c', }], 'type': '10', 'user_id': '11', @@ -59,7 +61,7 @@ class TestAlarm(testtools.TestCase): self.assertIsNone(sot.resource_key) self.assertIsNone(sot.resources_key) self.assertEqual('/alarms', sot.base_path) - self.assertEqual('metering', sot.service.service_type) + self.assertEqual('alarming', sot.service.service_type) self.assertTrue(sot.allow_create) self.assertTrue(sot.allow_retrieve) self.assertTrue(sot.allow_update) diff --git a/openstack/tests/unit/telemetry/v2/test_alarm_change.py b/openstack/tests/unit/telemetry/alarm/v2/test_alarm_change.py similarity index 95% rename from openstack/tests/unit/telemetry/v2/test_alarm_change.py rename to openstack/tests/unit/telemetry/alarm/v2/test_alarm_change.py index 94c9f3b0..bd272440 100644 --- a/openstack/tests/unit/telemetry/v2/test_alarm_change.py +++ b/openstack/tests/unit/telemetry/alarm/v2/test_alarm_change.py @@ -13,7 +13,7 @@ import mock import testtools -from openstack.telemetry.v2 import alarm_change +from openstack.telemetry.alarm.v2 import alarm_change IDENTIFIER = 'IDENTIFIER' EXAMPLE = { @@ -35,7 +35,7 @@ class TestAlarmChange(testtools.TestCase): self.assertEqual('alarm_change', sot.resource_key) self.assertIsNone(sot.resources_key) self.assertEqual('/alarms/%(alarm_id)s/history', sot.base_path) - self.assertEqual('metering', sot.service.service_type) + self.assertEqual('alarming', sot.service.service_type) self.assertFalse(sot.allow_create) self.assertFalse(sot.allow_retrieve) self.assertFalse(sot.allow_update) diff --git a/openstack/tests/unit/telemetry/alarm/v2/test_proxy.py b/openstack/tests/unit/telemetry/alarm/v2/test_proxy.py new file mode 100644 index 00000000..343db891 --- /dev/null +++ b/openstack/tests/unit/telemetry/alarm/v2/test_proxy.py @@ -0,0 +1,54 @@ +# 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 openstack.telemetry.alarm.v2 import _proxy +from openstack.telemetry.alarm.v2 import alarm +from openstack.telemetry.alarm.v2 import alarm_change +from openstack.tests.unit import test_proxy_base + + +class TestAlarmProxy(test_proxy_base.TestProxyBase): + def setUp(self): + super(TestAlarmProxy, self).setUp() + self.proxy = _proxy.Proxy(self.session) + + def test_alarm_change_find(self): + self.verify_find(self.proxy.find_alarm_change, + alarm_change.AlarmChange) + + def test_alarm_changes(self): + larm = alarm.Alarm.existing(alarm_id='larm') + expected_kwargs = {'path_args': {'alarm_id': 'larm'}} + self.verify_list(self.proxy.alarm_changes, alarm_change.AlarmChange, + method_args=[larm], paginated=False, + expected_kwargs=expected_kwargs) + + def test_alarm_create_attrs(self): + self.verify_create(self.proxy.create_alarm, alarm.Alarm) + + def test_alarm_delete(self): + self.verify_delete(self.proxy.delete_alarm, alarm.Alarm, False) + + def test_alarm_delete_ignore(self): + self.verify_delete(self.proxy.delete_alarm, alarm.Alarm, True) + + def test_alarm_find(self): + self.verify_find(self.proxy.find_alarm, alarm.Alarm) + + def test_alarm_get(self): + self.verify_get(self.proxy.get_alarm, alarm.Alarm) + + def test_alarms(self): + self.verify_list(self.proxy.alarms, alarm.Alarm, paginated=False) + + def test_alarm_update(self): + self.verify_update(self.proxy.update_alarm, alarm.Alarm) diff --git a/openstack/tests/unit/telemetry/v2/test_proxy.py b/openstack/tests/unit/telemetry/v2/test_proxy.py index 162d9ece..fa17bb5b 100644 --- a/openstack/tests/unit/telemetry/v2/test_proxy.py +++ b/openstack/tests/unit/telemetry/v2/test_proxy.py @@ -11,8 +11,6 @@ # under the License. from openstack.telemetry.v2 import _proxy -from openstack.telemetry.v2 import alarm -from openstack.telemetry.v2 import alarm_change from openstack.telemetry.v2 import capability from openstack.telemetry.v2 import meter from openstack.telemetry.v2 import resource @@ -26,38 +24,6 @@ class TestTelemetryProxy(test_proxy_base.TestProxyBase): super(TestTelemetryProxy, self).setUp() self.proxy = _proxy.Proxy(self.session) - def test_alarm_change_find(self): - self.verify_find(self.proxy.find_alarm_change, - alarm_change.AlarmChange) - - def test_alarm_changes(self): - larm = alarm.Alarm.existing(alarm_id='larm') - expected_kwargs = {'path_args': {'alarm_id': 'larm'}} - self.verify_list(self.proxy.alarm_changes, alarm_change.AlarmChange, - method_args=[larm], paginated=False, - expected_kwargs=expected_kwargs) - - def test_alarm_create_attrs(self): - self.verify_create(self.proxy.create_alarm, alarm.Alarm) - - def test_alarm_delete(self): - self.verify_delete(self.proxy.delete_alarm, alarm.Alarm, False) - - def test_alarm_delete_ignore(self): - self.verify_delete(self.proxy.delete_alarm, alarm.Alarm, True) - - def test_alarm_find(self): - self.verify_find(self.proxy.find_alarm, alarm.Alarm) - - def test_alarm_get(self): - self.verify_get(self.proxy.get_alarm, alarm.Alarm) - - def test_alarms(self): - self.verify_list(self.proxy.alarms, alarm.Alarm, paginated=False) - - def test_alarm_update(self): - self.verify_update(self.proxy.update_alarm, alarm.Alarm) - def test_capability_find(self): self.verify_find(self.proxy.find_capability, capability.Capability) diff --git a/openstack/tests/unit/test_connection.py b/openstack/tests/unit/test_connection.py index 7cc63dca..2381dece 100644 --- a/openstack/tests/unit/test_connection.py +++ b/openstack/tests/unit/test_connection.py @@ -111,6 +111,8 @@ class TestConnection(base.TestCase): conn = connection.Connection(authenticator=auth, profile=prof) self.assertEqual(auth, conn.authenticator) self.assertEqual(prof, conn.profile) + self.assertEqual('openstack.telemetry.alarm.v2._proxy', + conn.alarm.__class__.__module__) self.assertEqual('openstack.cluster.v1._proxy', conn.cluster.__class__.__module__) self.assertEqual('openstack.compute.v2._proxy', diff --git a/openstack/tests/unit/test_profile.py b/openstack/tests/unit/test_profile.py index 97b7716a..7f850160 100644 --- a/openstack/tests/unit/test_profile.py +++ b/openstack/tests/unit/test_profile.py @@ -19,6 +19,7 @@ class TestProfile(base.TestCase): def test_init(self): prof = profile.Profile() expected = [ + 'alarming', 'clustering', 'compute', 'database', @@ -51,10 +52,12 @@ class TestProfile(base.TestCase): def test_set(self): prof = profile.Profile() - prof.set_version('compute', 'v2') - self.assertEqual('v2', prof.get_filter('compute').version) + prof.set_version('alarming', 'v2') + self.assertEqual('v2', prof.get_filter('alarming').version) prof.set_version('clustering', 'v1') self.assertEqual('v1', prof.get_filter('clustering').version) + prof.set_version('compute', 'v2') + self.assertEqual('v2', prof.get_filter('compute').version) prof.set_version('database', 'v3') self.assertEqual('v3', prof.get_filter('database').version) prof.set_version('identity', 'v4')