Add methods to resource classes

Resource classes of managers should have methods
like delete() and get(). Basicly base.Resource
class has method get(), which uses id attribute,
but classes Alarm, Event, etc. have no this attribute.
Added intercept getting of id in the resource classes.
Also added catch of HTTPNotFound for alarm get()
because it affects correct functionality of
scenario tests.

Closes-Bug: #1312146
Change-Id: Ie598b73c64dece2185955467936dc6544a8a3dc7
This commit is contained in:
Artur Svechnikov
2014-05-01 17:00:26 +04:00
parent 4862913edd
commit b8a3fe54c0
7 changed files with 105 additions and 20 deletions

View File

@@ -201,6 +201,10 @@ fixtures = {
{},
UPDATED_ALARM,
),
'DELETE': (
{},
None,
),
},
'/v2/alarms/alarm-id/state':
{
@@ -343,6 +347,40 @@ class AlarmManagerTest(testtools.TestCase):
self.assertEqual(self.api.calls, expect)
self.assertTrue(deleted is None)
def test_get_from_alarm_class(self):
alarm = self.mgr.get(alarm_id='alarm-id')
self.assertTrue(alarm)
alarm.get()
expect = [
('GET', '/v2/alarms/alarm-id', {}, None),
('GET', '/v2/alarms/alarm-id', {}, None)
]
self.assertEqual(expect, self.api.calls)
self.assertEqual('alarm-id', alarm.alarm_id)
self.assertEqual(alarm.threshold_rule, alarm.rule)
def test_get_state_from_alarm_class(self):
alarm = self.mgr.get(alarm_id='alarm-id')
self.assertTrue(alarm)
state = alarm.get_state()
expect = [
('GET', '/v2/alarms/alarm-id', {}, None),
('GET', '/v2/alarms/alarm-id/state', {}, None)
]
self.assertEqual(expect, self.api.calls)
self.assertEqual('alarm', state)
def test_delete_from_alarm_class(self):
alarm = self.mgr.get(alarm_id='alarm-id')
self.assertTrue(alarm)
deleted = alarm.delete()
expect = [
('GET', '/v2/alarms/alarm-id', {}, None),
('DELETE', '/v2/alarms/alarm-id', {}, None)
]
self.assertEqual(expect, self.api.calls)
self.assertTrue(deleted is None)
def _do_test_get_history(self, q, url):
history = self.mgr.get_history(q=q, alarm_id='alarm-id')
expect = [('GET', url, {}, None)]

View File

@@ -22,22 +22,22 @@ fixtures = {
{},
[
{
'message_id': '1',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'abc',
'message_id': '1'},
'traits': {'trait_A': 'abc'},
},
{
'message_id': '2',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'def',
'message_id': '2'},
'traits': {'trait_A': 'def'},
},
{
'message_id': '3',
'event_type': 'Bar',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_B': 'bartrait',
'message_id': '3'},
'traits': {'trait_B': 'bartrait'},
},
]
),
@@ -48,18 +48,18 @@ fixtures = {
{},
[
{
'message_id': '1',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'abc',
'hostname': 'localhost',
'message_id': '1'},
'hostname': 'localhost'},
},
{
'message_id': '2',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'def',
'hostname': 'localhost',
'message_id': '2'},
'hostname': 'localhost'},
}
]
),
@@ -70,18 +70,18 @@ fixtures = {
{},
[
{
'message_id': '1',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'abc',
'hostname': 'foreignhost',
'message_id': '1'},
'hostname': 'foreignhost'},
},
{
'message_id': '2',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'def',
'hostname': 'foreignhost',
'message_id': '2'},
'hostname': 'foreignhost'},
}
]
),
@@ -93,12 +93,12 @@ fixtures = {
{},
[
{
'message_id': '1',
'event_type': 'Bar',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'abc',
'hostname': 'localhost',
'num_cpus': '5',
'message_id': '1'},
'num_cpus': '5'},
},
]
),
@@ -109,10 +109,10 @@ fixtures = {
'GET': (
{},
{
'message_id': '2',
'event_type': 'Foo',
'generated': '1970-01-01T00:00:00',
'traits': {'trait_A': 'def',
'message_id': '2',
'intTrait': '42'},
}
),
@@ -186,3 +186,14 @@ class EventManagerTest(utils.BaseTestCase):
]
self.assertEqual(self.api.calls, expect)
self.assertEqual(len(events), 1)
def test_get_from_event_class(self):
event = self.mgr.get(2)
self.assertTrue(event)
event.get()
expect = [
('GET', '/v2/events/2', {}, None),
('GET', '/v2/events/2', {}, None),
]
self.assertEqual(expect, self.api.calls)
self.assertEqual('Foo', event.event_type)

View File

@@ -104,3 +104,14 @@ class ResourceManagerTest(utils.BaseTestCase):
self.assertEqual(self.api.calls, expect)
self.assertEqual(len(resources), 1)
self.assertEqual(resources[0].resource_id, 'a')
def test_get_from_resource_class(self):
resource = self.mgr.get(resource_id='a')
self.assertTrue(resource)
resource.get()
expect = [
('GET', '/v2/resources/a', {}, None),
('GET', '/v2/resources/a', {}, None),
]
self.assertEqual(expect, self.api.calls)
self.assertEqual('a', resource.resource_id)

View File

@@ -19,6 +19,7 @@ import warnings
from ceilometerclient.common import base
from ceilometerclient.common import utils
from ceilometerclient import exc
from ceilometerclient.v2 import options
@@ -48,8 +49,16 @@ class Alarm(base.Resource):
# that look like the Alarm storage object
if k == 'rule':
k = '%s_rule' % self.type
if k == 'id':
return self.alarm_id
return super(Alarm, self).__getattr__(k)
def delete(self):
return self.manager.delete(self.alarm_id)
def get_state(self):
return self.manager.get_state(self.alarm_id)
class AlarmChange(base.Resource):
def __repr__(self):
@@ -74,6 +83,13 @@ class AlarmManager(base.Manager):
return self._list(self._path(alarm_id), expect_single=True)[0]
except IndexError:
return None
except exc.HTTPNotFound:
# When we try to get deleted alarm HTTPNotFound occurs
# or when alarm doesn't exists this exception don't must
# go deeper because cleanUp() (method which remove all
# created things like instance, alarm, etc.) at scenario
# tests doesn't know how to process it
return None
@classmethod
def _compat_legacy_alarm_kwargs(cls, kwargs, create=False):

View File

@@ -20,6 +20,11 @@ class Event(base.Resource):
def __repr__(self):
return "<Event %s>" % self._info
def __getattr__(self, k):
if k == 'id':
return self.message_id
return super(Event, self).__getattr__(k)
class EventManager(base.Manager):
resource_class = Event

View File

@@ -21,6 +21,11 @@ class Resource(base.Resource):
def __repr__(self):
return "<Resource %s>" % self._info
def __getattr__(self, k):
if k == 'id':
return self.resource_id
return super(Resource, self).__getattr__(k)
class ResourceManager(base.Manager):
resource_class = Resource

View File

@@ -321,9 +321,8 @@ def _display_alarm(alarm):
help='ID of the alarm to show.')
def do_alarm_show(cc, args={}):
'''Show an alarm.'''
try:
alarm = cc.alarms.get(args.alarm_id)
except exc.HTTPNotFound:
alarm = cc.alarms.get(args.alarm_id)
if alarm is None:
raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
else:
_display_alarm(alarm)