Merge "Add notifications for identity authenticate events"
This commit is contained in:
commit
bb3deafd12
@ -46,6 +46,8 @@ class _Base(plugin.NotificationBase):
|
|||||||
exchange=conf.keystone_control_exchange)
|
exchange=conf.keystone_control_exchange)
|
||||||
for topic in conf.notification_topics]
|
for topic in conf.notification_topics]
|
||||||
|
|
||||||
|
|
||||||
|
class IdentityCRUD(_Base):
|
||||||
def process_notification(self, message):
|
def process_notification(self, message):
|
||||||
yield sample.Sample.from_notification(
|
yield sample.Sample.from_notification(
|
||||||
name=message['event_type'],
|
name=message['event_type'],
|
||||||
@ -58,7 +60,7 @@ class _Base(plugin.NotificationBase):
|
|||||||
message=message)
|
message=message)
|
||||||
|
|
||||||
|
|
||||||
class User(_Base):
|
class User(IdentityCRUD):
|
||||||
|
|
||||||
resource_type = 'user'
|
resource_type = 'user'
|
||||||
resource_name = '%s.%s' % (SERVICE, resource_type)
|
resource_name = '%s.%s' % (SERVICE, resource_type)
|
||||||
@ -68,7 +70,7 @@ class User(_Base):
|
|||||||
return ['%s.*' % (self.resource_name)]
|
return ['%s.*' % (self.resource_name)]
|
||||||
|
|
||||||
|
|
||||||
class Group(_Base):
|
class Group(IdentityCRUD):
|
||||||
|
|
||||||
resource_type = 'group'
|
resource_type = 'group'
|
||||||
resource_name = '%s.%s' % (SERVICE, resource_type)
|
resource_name = '%s.%s' % (SERVICE, resource_type)
|
||||||
@ -78,7 +80,7 @@ class Group(_Base):
|
|||||||
return ['%s.*' % (self.resource_name)]
|
return ['%s.*' % (self.resource_name)]
|
||||||
|
|
||||||
|
|
||||||
class Project(_Base):
|
class Project(IdentityCRUD):
|
||||||
|
|
||||||
resource_type = 'project'
|
resource_type = 'project'
|
||||||
resource_name = '%s.%s' % (SERVICE, resource_type)
|
resource_name = '%s.%s' % (SERVICE, resource_type)
|
||||||
@ -88,7 +90,7 @@ class Project(_Base):
|
|||||||
return ['%s.*' % (self.resource_name)]
|
return ['%s.*' % (self.resource_name)]
|
||||||
|
|
||||||
|
|
||||||
class Role(_Base):
|
class Role(IdentityCRUD):
|
||||||
|
|
||||||
resource_type = 'role'
|
resource_type = 'role'
|
||||||
resource_name = '%s.%s' % (SERVICE, resource_type)
|
resource_name = '%s.%s' % (SERVICE, resource_type)
|
||||||
@ -98,7 +100,7 @@ class Role(_Base):
|
|||||||
return ['%s.*' % (self.resource_name)]
|
return ['%s.*' % (self.resource_name)]
|
||||||
|
|
||||||
|
|
||||||
class Trust(_Base):
|
class Trust(IdentityCRUD):
|
||||||
|
|
||||||
resource_type = 'trust'
|
resource_type = 'trust'
|
||||||
resource_name = '%s.%s' % (SERVICE, resource_type)
|
resource_name = '%s.%s' % (SERVICE, resource_type)
|
||||||
@ -109,3 +111,28 @@ class Trust(_Base):
|
|||||||
'%s.created' % (self.resource_name),
|
'%s.created' % (self.resource_name),
|
||||||
'%s.deleted' % (self.resource_name)
|
'%s.deleted' % (self.resource_name)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class Authenticate(_Base):
|
||||||
|
"""Convert identity authentication notifications into Samples."""
|
||||||
|
|
||||||
|
resource_type = 'authenticate'
|
||||||
|
event_name = '%s.%s' % (SERVICE, resource_type)
|
||||||
|
|
||||||
|
def process_notification(self, message):
|
||||||
|
outcome = message['payload']['outcome']
|
||||||
|
meter_name = '%s.%s.%s' % (SERVICE, self.resource_type, outcome)
|
||||||
|
|
||||||
|
yield sample.Sample.from_notification(
|
||||||
|
name=meter_name,
|
||||||
|
type=sample.TYPE_DELTA,
|
||||||
|
unit='user',
|
||||||
|
volume=1,
|
||||||
|
resource_id=message['payload']['initiator']['id'],
|
||||||
|
user_id=message['payload']['initiator']['id'],
|
||||||
|
project_id=None,
|
||||||
|
message=message)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def event_types(self):
|
||||||
|
return [self.event_name]
|
||||||
|
@ -44,7 +44,43 @@ def notification_for(resource_type, operation, resource_id):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class TestNotification(test.BaseTestCase):
|
def authn_notification_for(outcome):
|
||||||
|
|
||||||
|
return {
|
||||||
|
u'event_type': u'identity.authenticate',
|
||||||
|
u'message_id': u'1371a590-d5fd-448f-b3bb-a14dead6f4cb',
|
||||||
|
u'payload': {
|
||||||
|
u'typeURI': u'http://schemas.dmtf.org/cloud/audit/1.0/event',
|
||||||
|
u'initiator': {
|
||||||
|
u'typeURI': u'service/security/account/user',
|
||||||
|
u'host': {
|
||||||
|
u'agent': u'python-keystoneclient',
|
||||||
|
u'address': u'10.0.2.15'
|
||||||
|
},
|
||||||
|
u'id': USER_ID,
|
||||||
|
u'name': u'openstack:demo_user'
|
||||||
|
},
|
||||||
|
u'target': {
|
||||||
|
u'typeURI': u'service/security/account/user',
|
||||||
|
u'id': u'openstack:44b3d8cb-5f16-46e9-9b1b-ac90b64c2530'
|
||||||
|
},
|
||||||
|
u'observer': {
|
||||||
|
u'typeURI': u'service/security',
|
||||||
|
u'id': u'openstack:55a9e88c-a4b1-4864-9339-62b7e6ecb6a7'
|
||||||
|
},
|
||||||
|
u'eventType': u'activity',
|
||||||
|
u'eventTime': u'2014-08-04T05:38:59.978898+0000',
|
||||||
|
u'action': u'authenticate',
|
||||||
|
u'outcome': outcome,
|
||||||
|
u'id': u'openstack:eca02fef-9394-4008-8fb3-c434133ca4b2'
|
||||||
|
},
|
||||||
|
u'priority': u'INFO',
|
||||||
|
u'publisher_id': PUBLISHER_ID,
|
||||||
|
u'timestamp': NOW
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TestCRUDNotification(test.BaseTestCase):
|
||||||
|
|
||||||
def _verify_common_sample(self, s):
|
def _verify_common_sample(self, s):
|
||||||
self.assertIsNotNone(s)
|
self.assertIsNotNone(s)
|
||||||
@ -110,3 +146,35 @@ class TestNotification(test.BaseTestCase):
|
|||||||
|
|
||||||
def test_delete_trust(self):
|
def test_delete_trust(self):
|
||||||
self._test_operation('trust', 'deleted', TRUST_ID, notifications.Trust)
|
self._test_operation('trust', 'deleted', TRUST_ID, notifications.Trust)
|
||||||
|
|
||||||
|
|
||||||
|
class TestAuthenticationNotification(test.BaseTestCase):
|
||||||
|
|
||||||
|
def _verify_common_sample(self, s):
|
||||||
|
self.assertIsNotNone(s)
|
||||||
|
self.assertEqual(NOW, s.timestamp)
|
||||||
|
self.assertEqual(sample.TYPE_DELTA, s.type)
|
||||||
|
self.assertIsNone(s.project_id)
|
||||||
|
self.assertEqual(USER_ID, s.user_id)
|
||||||
|
self.assertEqual(USER_ID, s.resource_id)
|
||||||
|
self.assertEqual('user', s.unit)
|
||||||
|
metadata = s.resource_metadata
|
||||||
|
self.assertEqual(PUBLISHER_ID, metadata.get('host'))
|
||||||
|
|
||||||
|
def _test_operation(self, outcome):
|
||||||
|
notif = authn_notification_for(outcome)
|
||||||
|
handler = notifications.Authenticate(mock.Mock())
|
||||||
|
data = list(handler.process_notification(notif))
|
||||||
|
self.assertEqual(1, len(data))
|
||||||
|
name = '%s.%s.%s' % (notifications.SERVICE, 'authenticate', outcome)
|
||||||
|
self.assertEqual(name, data[0].name)
|
||||||
|
self._verify_common_sample(data[0])
|
||||||
|
|
||||||
|
def test_authn_success(self):
|
||||||
|
self._test_operation('success')
|
||||||
|
|
||||||
|
def test_authn_failure(self):
|
||||||
|
self._test_operation('failure')
|
||||||
|
|
||||||
|
def test_authn_pending(self):
|
||||||
|
self._test_operation('pending')
|
||||||
|
@ -51,6 +51,7 @@ ceilometer.notification =
|
|||||||
volume_size = ceilometer.volume.notifications:VolumeSize
|
volume_size = ceilometer.volume.notifications:VolumeSize
|
||||||
snapshot = ceilometer.volume.notifications:Snapshot
|
snapshot = ceilometer.volume.notifications:Snapshot
|
||||||
snapshot_size = ceilometer.volume.notifications:SnapshotSize
|
snapshot_size = ceilometer.volume.notifications:SnapshotSize
|
||||||
|
authenticate = ceilometer.identity.notifications:Authenticate
|
||||||
user = ceilometer.identity.notifications:User
|
user = ceilometer.identity.notifications:User
|
||||||
group = ceilometer.identity.notifications:Group
|
group = ceilometer.identity.notifications:Group
|
||||||
role = ceilometer.identity.notifications:Role
|
role = ceilometer.identity.notifications:Role
|
||||||
|
Loading…
x
Reference in New Issue
Block a user