Convert identity, sahara and volume to meters yaml

Change-Id: Ica102ab3a003f4a7d84ad435c00993d5d81db767
This commit is contained in:
Pradeep Kilambi 2015-07-16 18:17:08 -04:00 committed by Mehdi Abaakouk (sileht)
parent 94b3d40cea
commit 201b3ef522
16 changed files with 475 additions and 1174 deletions

View File

@ -1,71 +0,0 @@
# Copyright (c) 2014 Mirantis Inc.
#
# 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
import oslo_messaging
from ceilometer.agent import plugin_base
from ceilometer import sample
OPTS = [
cfg.StrOpt('sahara_control_exchange',
default='sahara',
help="Exchange name for Data Processing notifications."),
]
cfg.CONF.register_opts(OPTS)
SERVICE = 'sahara'
class DataProcessing(plugin_base.NotificationBase,
plugin_base.NonMetricNotificationBase):
resource_name = '%s.cluster' % SERVICE
@property
def event_types(self):
return [
'%s.create' % self.resource_name,
'%s.update' % self.resource_name,
'%s.delete' % self.resource_name,
]
@staticmethod
def get_targets(conf):
"""Return a sequence of oslo_messaging.Target
It is defining the exchange and topics to be connected for this plugin.
"""
return [oslo_messaging.Target(topic=topic,
exchange=conf.sahara_control_exchange)
for topic in conf.notification_topics]
def process_notification(self, message):
name = message['event_type'].replace(self.resource_name, 'cluster')
project_id = message['payload']['project_id']
user_id = message['_context_user_id']
yield sample.Sample.from_notification(
name=name,
type=sample.TYPE_DELTA,
unit='cluster',
volume=1,
resource_id=message['payload']['cluster_id'],
user_id=user_id,
project_id=project_id,
message=message)

View File

@ -23,4 +23,13 @@ EXCHANGE_OPTS = [
cfg.StrOpt('magnetodb_control_exchange', cfg.StrOpt('magnetodb_control_exchange',
default='magnetodb', default='magnetodb',
help="Exchange name for Magnetodb notifications."), help="Exchange name for Magnetodb notifications."),
cfg.StrOpt('keystone_control_exchange',
default='keystone',
help="Exchange name for Keystone notifications."),
cfg.StrOpt('cinder_control_exchange',
default='cinder',
help="Exchange name for Cinder notifications."),
cfg.StrOpt('sahara_control_exchange',
default='sahara',
help="Exchange name for Data Processing notifications."),
] ]

View File

@ -1,172 +0,0 @@
# Copyright 2014 Mirantis Inc.
# 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
import oslo_messaging
from ceilometer.agent import plugin_base
from ceilometer import sample
OPTS = [
cfg.StrOpt('keystone_control_exchange',
default='keystone',
help="Exchange name for Keystone notifications."),
]
cfg.CONF.register_opts(OPTS)
SERVICE = 'identity'
class _Base(plugin_base.NotificationBase,
plugin_base.NonMetricNotificationBase):
"""Convert identity notification into Samples."""
resource_type = None
resource_name = None
@staticmethod
def get_targets(conf):
"""Return a sequence of oslo_messaging.Target
Sequence defining the exchange and topics to be connected for this
plugin.
"""
return [oslo_messaging.Target(topic=topic,
exchange=conf.keystone_control_exchange)
for topic in conf.notification_topics]
class IdentityCRUD(_Base):
def process_notification(self, message):
user_id = message['payload'].get("initiator", {}).get("id")
yield sample.Sample.from_notification(
name=message['event_type'],
type=sample.TYPE_DELTA,
unit=self.resource_type,
volume=1,
resource_id=message['payload']['resource_info'],
user_id=user_id,
project_id=None,
message=message)
class User(IdentityCRUD):
resource_type = 'user'
resource_name = '%s.%s' % (SERVICE, resource_type)
@property
def event_types(self):
return ['%s.*' % self.resource_name]
class Group(IdentityCRUD):
resource_type = 'group'
resource_name = '%s.%s' % (SERVICE, resource_type)
@property
def event_types(self):
return ['%s.*' % self.resource_name]
class Project(IdentityCRUD):
resource_type = 'project'
resource_name = '%s.%s' % (SERVICE, resource_type)
@property
def event_types(self):
return ['%s.*' % self.resource_name]
class Role(IdentityCRUD):
resource_type = 'role'
resource_name = '%s.%s' % (SERVICE, resource_type)
@property
def event_types(self):
return ['%s\..*' % self.resource_name]
class Trust(IdentityCRUD):
resource_type = 'OS-TRUST:trust'
resource_name = '%s.%s' % (SERVICE, resource_type)
@property
def event_types(self):
return [
'%s.created' % 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]
class RoleAssignment(_Base):
"""Convert role assignment notifications into Samples."""
resource_type = 'role_assignment'
resource_name = '%s.%s' % (SERVICE, resource_type)
def process_notification(self, message):
# NOTE(stevemar): action is created.role_assignment
action = message['payload']['action']
event, resource_type = action.split(".")
# NOTE(stevemar): meter_name is identity.role_assignment.created
meter_name = '%s.%s.%s' % (SERVICE, resource_type, event)
yield sample.Sample.from_notification(
name=meter_name,
type=sample.TYPE_DELTA,
unit=self.resource_type,
volume=1,
resource_id=message['payload']['role'],
user_id=message['payload']['initiator']['id'],
project_id=None,
message=message)
@property
def event_types(self):
return [
'%s.created' % self.resource_name,
'%s.deleted' % self.resource_name,
]

View File

@ -39,6 +39,33 @@ metric:
resource_id: payload.table_uuid resource_id: payload.table_uuid
user_id: _context_user user_id: _context_user
- name: 'volume.size'
event_type:
- 'volume.exists'
- 'volume.create.*'
- 'volume.delete.*'
- 'volume.resize.*'
- 'volume.attach.*'
- 'volume.detach.*'
- 'volume.update.*'
type: 'gauge'
unit: 'GB'
volume: payload.size
user_id: payload.user_id
project_id: payload.tenant_id
resource_id: payload.volume_id
- name: 'snapshot.size'
event_type:
- 'snapshot.exists'
- 'snapshot.create.*'
- 'snapshot.delete.*'
type: 'gauge'
unit: 'GB'
volume: payload.volume_size
user_id: payload.user_id
project_id: payload.tenant_id
resource_id: payload.snapshot_id
# NOTE: non-metric meters are generally events/existence meters # NOTE: non-metric meters are generally events/existence meters
# These are expected to be DEPRECATED in future releases # These are expected to be DEPRECATED in future releases
@ -46,9 +73,9 @@ metric:
# Image # Image
- name: "image" - name: "image"
event_type: event_type:
- "image.upload" - "image.upload"
- "image.delete" - "image.delete"
- "image.update" - "image.update"
type: "gauge" type: "gauge"
unit: 'image' unit: 'image'
volume: 1 volume: 1
@ -124,3 +151,415 @@ metric:
resource_id: payload.table_uuid resource_id: payload.table_uuid
user_id: _context_user user_id: _context_user
project_id: _context_tenant project_id: _context_tenant
# Volume
- name: 'volume'
type: 'gauge'
unit: 'volume'
volume: 1
event_type:
- 'volume.exists'
- 'volume.create.*'
- 'volume.delete.*'
- 'volume.resize.*'
- 'volume.attach.*'
- 'volume.detach.*'
- 'volume.update.*'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.exists'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.exists'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.create.start'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.create.start'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.create.end'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.create.end'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.delete.start'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.delete.start'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.delete.end'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.delete.end'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.update.end'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.update.end'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.update.start'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.update.start'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.resize.end'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.resize.end'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.resize.start'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.resize.start'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.attach.end'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.attach.end'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.attach.start'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.attach.start'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.detach.end'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.detach.end'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'volume.detach.start'
type: 'delta'
unit: 'volume'
volume: 1
event_type:
- 'volume.detach.start'
resource_id: payload.volume_id
user_id: payload.user_id
project_id: payload.tenant_id
# Volume Snapshot
- name: 'snapshot'
type: 'gauge'
unit: 'snapshot'
volume: 1
event_type:
- 'snapshot.exists'
- 'snapshot.create.*'
- 'snapshot.delete.*'
resource_id: payload.snapshot_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'snapshot.exists'
type: 'delta'
unit: 'snapshot'
volume: 1
event_type:
- 'snapshot.exists'
resource_id: payload.snapshot_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'snapshot.create.start'
type: 'delta'
unit: 'snapshot'
volume: 1
event_type:
- 'snapshot.create.start'
resource_id: payload.snapshot_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'snapshot.create.end'
type: 'delta'
unit: 'snapshot'
volume: 1
event_type:
- 'snapshot.create.end'
resource_id: payload.snapshot_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'snapshot.delete.start'
type: 'delta'
unit: 'snapshot'
volume: 1
event_type:
- 'snapshot.delete.start'
resource_id: payload.snapshot_id
user_id: payload.user_id
project_id: payload.tenant_id
- name: 'snapshot.delete.end'
type: 'delta'
unit: 'snapshot'
volume: 1
event_type:
- 'snapshot.delete.end'
resource_id: payload.snapshot_id
user_id: payload.user_id
project_id: payload.tenant_id
# Sahara
- name: 'cluster.create'
type: 'delta'
unit: 'cluster'
volume: 1
event_type:
- 'sahara.cluster.create'
resource_id: payload.cluster_id
project_id: payload.project_id
- name: 'cluster.update'
type: 'delta'
unit: 'cluster'
volume: 1
event_type:
- 'sahara.cluster.update'
resource_id: payload.cluster_id
project_id: payload.project_id
- name: 'cluster.delete'
type: 'delta'
unit: 'cluster'
volume: 1
event_type:
- 'sahara.cluster.delete'
resource_id: payload.cluster_id
project_id: payload.project_id
# Identity
- name: 'identity.user.created'
type: 'delta'
unit: 'user'
volume: 1
event_type:
- 'identity.user.created'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.user.updated'
type: 'delta'
unit: 'user'
volume: 1
event_type:
- 'identity.user.updated'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.user.deleted'
type: 'delta'
unit: 'user'
volume: 1
event_type:
- 'identity.user.deleted'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.group.created'
type: 'delta'
unit: 'group'
volume: 1
event_type:
- 'identity.group.created'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.group.updated'
type: 'delta'
unit: 'group'
volume: 1
event_type:
- 'identity.group.updated'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.group.deleted'
type: 'delta'
unit: 'group'
volume: 1
event_type:
- 'identity.group.deleted'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.project.created'
type: 'delta'
unit: 'project'
volume: 1
event_type:
- 'identity.project.created'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.project.updated'
type: 'delta'
unit: 'project'
volume: 1
event_type:
- 'identity.project.updated'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.project.deleted'
type: 'delta'
unit: 'project'
volume: 1
event_type:
- 'identity.project.deleted'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.role.created'
type: 'delta'
unit: 'role'
volume: 1
event_type:
- 'identity.role.created'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.role.updated'
type: 'delta'
unit: 'role'
volume: 1
event_type:
- 'identity.role.updated'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.role.deleted'
type: 'delta'
unit: 'role'
volume: 1
event_type:
- 'identity.role.deleted'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.role_assignment.created'
type: 'delta'
unit: 'role_assignment'
volume: 1
event_type:
- 'identity.role_assignment.created'
resource_id: payload.role
user_id: payload.initiator.id
- name: 'identity.role_assignment.deleted'
type: 'delta'
unit: 'role_assignment'
volume: 1
event_type:
- 'identity.role_assignment.deleted'
resource_id: payload.role
user_id: payload.initiator.id
- name: 'identity.authenticate.success'
type: 'delta'
unit: 'user'
volume: 1
event_type:
- 'identity.authenticate'
resource_id: payload.initiator.id
user_id: payload.initiator.id
- name: 'identity.authenticate.pending'
type: 'delta'
unit: 'user'
volume: 1
event_type:
- 'identity.authenticate'
resource_id: payload.initiator.id
user_id: payload.initiator.id
- name: 'identity.authenticate.failure'
type: 'delta'
unit: 'user'
volume: 1
event_type:
- 'identity.authenticate'
resource_id: payload.initiator.id
user_id: payload.initiator.id
- name: 'identity.trust.created'
type: 'delta'
unit: 'trust'
volume: 1
event_type:
- 'identity.trust.created'
resource_id: payload.resource_info
user_id: payload.initiator.id
- name: 'identity.trust.deleted'
type: 'delta'
unit: 'trust'
volume: 1
event_type:
- 'identity.trust.deleted'
resource_id: payload.resource_info
user_id: payload.initiator.id

View File

@ -26,7 +26,7 @@ cfg.CONF.import_opt('glance_control_exchange',
cfg.CONF.import_opt('neutron_control_exchange', cfg.CONF.import_opt('neutron_control_exchange',
'ceilometer.network.notifications') 'ceilometer.network.notifications')
cfg.CONF.import_opt('cinder_control_exchange', cfg.CONF.import_opt('cinder_control_exchange',
'ceilometer.volume.notifications') 'ceilometer.notification')
OPTS = [ OPTS = [
cfg.MultiStrOpt('http_control_exchanges', cfg.MultiStrOpt('http_control_exchanges',

View File

@ -30,13 +30,11 @@ import ceilometer.compute.virt.libvirt.inspector
import ceilometer.compute.virt.vmware.inspector import ceilometer.compute.virt.vmware.inspector
import ceilometer.compute.virt.xenapi.inspector import ceilometer.compute.virt.xenapi.inspector
import ceilometer.coordination import ceilometer.coordination
import ceilometer.data_processing.notifications
import ceilometer.dispatcher import ceilometer.dispatcher
import ceilometer.dispatcher.file import ceilometer.dispatcher.file
import ceilometer.energy.kwapi import ceilometer.energy.kwapi
import ceilometer.event.converter import ceilometer.event.converter
import ceilometer.hardware.discovery import ceilometer.hardware.discovery
import ceilometer.identity.notifications
import ceilometer.image.glance import ceilometer.image.glance
import ceilometer.ipmi.notifications.ironic import ceilometer.ipmi.notifications.ironic
import ceilometer.ipmi.platform.intel_node_manager import ceilometer.ipmi.platform.intel_node_manager
@ -56,7 +54,6 @@ import ceilometer.sample
import ceilometer.service import ceilometer.service
import ceilometer.storage import ceilometer.storage
import ceilometer.utils import ceilometer.utils
import ceilometer.volume.notifications
def list_opts(): def list_opts():
@ -69,9 +66,7 @@ def list_opts():
ceilometer.compute.util.OPTS, ceilometer.compute.util.OPTS,
ceilometer.compute.virt.inspector.OPTS, ceilometer.compute.virt.inspector.OPTS,
ceilometer.compute.virt.libvirt.inspector.OPTS, ceilometer.compute.virt.libvirt.inspector.OPTS,
ceilometer.data_processing.notifications.OPTS,
ceilometer.dispatcher.OPTS, ceilometer.dispatcher.OPTS,
ceilometer.identity.notifications.OPTS,
ceilometer.image.glance.OPTS, ceilometer.image.glance.OPTS,
ceilometer.ipmi.notifications.ironic.OPTS, ceilometer.ipmi.notifications.ironic.OPTS,
ceilometer.middleware.OPTS, ceilometer.middleware.OPTS,
@ -83,8 +78,7 @@ def list_opts():
ceilometer.sample.OPTS, ceilometer.sample.OPTS,
ceilometer.service.OPTS, ceilometer.service.OPTS,
ceilometer.storage.OLD_OPTS, ceilometer.storage.OLD_OPTS,
ceilometer.utils.OPTS, ceilometer.utils.OPTS,)),
ceilometer.volume.notifications.OPTS,)),
('alarm', ('alarm',
itertools.chain(ceilometer.alarm.notifier.rest.OPTS, itertools.chain(ceilometer.alarm.notifier.rest.OPTS,
ceilometer.alarm.service.OPTS, ceilometer.alarm.service.OPTS,

View File

@ -32,7 +32,7 @@ OPTS = [
cfg.CONF.register_opts(OPTS) cfg.CONF.register_opts(OPTS)
# TODO(boris-42): remove after adding keystone audit plugins. # TODO(boris-42): remove after adding keystone audit plugins.
cfg.CONF.import_opt('keystone_control_exchange', cfg.CONF.import_opt('keystone_control_exchange',
'ceilometer.identity.notifications') 'ceilometer.notification')
class ProfilerNotifications(plugin_base.NotificationBase, class ProfilerNotifications(plugin_base.NotificationBase,

View File

@ -1,101 +0,0 @@
# Copyright (c) 2014 Mirantis Inc.
#
# 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 datetime
import mock
from oslo_config import cfg
from oslo_log import log
from oslotest import base
from ceilometer.data_processing import notifications
from ceilometer import sample
NOW = datetime.datetime.isoformat(datetime.datetime.utcnow())
TENANT_ID = u'4c35985848bf4419b3f3d52c22e5792d'
CLUSTER_NAME = u'AS1-ASGroup-53sqbo7sor7i'
CLUSTER_ID = u'cb4a6fd1-1f5d-4002-ae91-9b91573cfb03'
USER_NAME = u'demo'
USER_ID = u'2e61f25ec63a4f6c954a6245421448a4'
CLUSTER_STATUS = u'Active'
PROJECT_ID = TENANT_ID
RESOURCE_ID = CLUSTER_ID
PUBLISHER_ID = u'data_processing.node-n5x66lxdy67d'
CONF = cfg.CONF
log.register_options(CONF)
CONF.set_override('use_stderr', True)
LOG = log.getLogger(__name__)
def _dp_notification_for(operation):
return {
u'event_type': '%s.cluster.%s' % (notifications.SERVICE,
operation),
u'_context_roles': [
u'Member',
],
u'_context_auth_uri': u'http://0.1.0.1:1010/v2.0',
u'timestamp': NOW,
u'_context_tenant_id': TENANT_ID,
u'payload': {
u'cluster_id': CLUSTER_ID,
u'cluster_name': CLUSTER_NAME,
u'cluster_status': CLUSTER_STATUS,
u'project_id': TENANT_ID,
u'user_id': USER_ID,
},
u'_context_username': USER_NAME,
u'_context_token': u'MIISAwYJKoZIhvcNAQcCoII...',
u'_context_user_id': USER_ID,
u'_context_tenant_name': USER_NAME,
u'priority': u'INFO',
u'_context_is_admin': False,
u'publisher_id': PUBLISHER_ID,
u'message_id': u'ef921faa-7f7b-4854-8b86-a424ab93c96e',
}
class TestNotification(base.BaseTestCase):
def _verify_common_sample(self, actual, operation):
self.assertIsNotNone(actual)
self.assertEqual('cluster.%s' % operation, actual.name)
self.assertEqual(NOW, actual.timestamp)
self.assertEqual(sample.TYPE_DELTA, actual.type)
self.assertEqual(PROJECT_ID, actual.project_id)
self.assertEqual(RESOURCE_ID, actual.resource_id)
self.assertEqual(USER_ID, actual.user_id)
metadata = actual.resource_metadata
self.assertEqual(PUBLISHER_ID, metadata.get('host'))
def _test_operation(self, operation):
notif = _dp_notification_for(operation)
handler = notifications.DataProcessing(mock.Mock())
data = list(handler.process_notification(notif))
self.assertEqual(1, len(data))
self._verify_common_sample(data[0], operation)
def test_create(self):
self._test_operation('create')
def test_update(self):
self._test_operation('update')
def test_delete(self):
self._test_operation('delete')

View File

@ -1,310 +0,0 @@
# 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 datetime
import mock
from oslotest import base
from ceilometer.identity import notifications
from ceilometer import sample
NOW = datetime.datetime.isoformat(datetime.datetime.utcnow())
PROJECT_ID = u'project_id'
DOMAIN_ID = u'domain_id'
USER_ID = u'user_id'
ROLE_ID = u'role_id'
GROUP_ID = u'group_id'
TRUST_ID = u'trust_id'
PUBLISHER_ID = u'identity.node-n5x66lxdy67d'
ROLE_ASSIGNMENT = 'role_assignment'
def notification_for(resource_type, operation, resource_id):
return {
u'event_type': '%s.%s.%s' % (notifications.SERVICE, resource_type,
operation),
u'message_id': u'ef921faa-7f7b-4854-8b86-a424ab93c96e',
u'payload': {
u'resource_info': resource_id
},
u'priority': u'INFO',
u'publisher_id': PUBLISHER_ID,
u'timestamp': NOW
}
def cadf_format_notification():
return {
u'event_type': u'some_identity_event',
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'action_name',
u'outcome': 'success',
u'id': u'openstack:eca02fef-9394-4008-8fb3-c434133ca4b2'
},
u'priority': u'INFO',
u'publisher_id': PUBLISHER_ID,
u'timestamp': NOW
}
def cadf_crud_notification_for(resource_type, operation, resource_id):
base = cadf_format_notification()
event_type = '%s.%s.%s' % (notifications.SERVICE, resource_type,
operation)
base['event_type'] = event_type
base['payload']['action'] = '%s.%s' % (operation, resource_type)
base['payload']['resource_info'] = resource_id
return base
def authn_notification_for(outcome):
base = cadf_format_notification()
base['event_type'] = 'identity.authenticate'
base['payload']['action'] = 'authenticate'
base['payload']['outcome'] = outcome
return base
def notification_for_role_change(action, project, user):
"""Create a notifications for a role_assignment
In this case, action is either 'created' or 'deleted'. Also
in a role_assignment notifications, in the payload portion,
there may be a 'domain' key or a 'project' key, never both.
The same holds for the 'user' key and 'group' key.
There must always be a 'role'.
"""
base = cadf_format_notification()
# NOTE(stevemar): i.e. created.role_assignment
action_name = '%s.%s' % (action, ROLE_ASSIGNMENT)
event, resource_type = action_name.split(".")
# NOTE(stevemar): i.e. identity.role_assignment.created
event_name = '%s.%s.%s' % (notifications.SERVICE, resource_type, event)
base['event_type'] = event_name
base['payload']['action'] = action_name
base['payload']['role'] = ROLE_ID
base['payload']['inherited_to_projects'] = False
if project:
base['payload']['project'] = PROJECT_ID
else:
base['payload']['domain'] = DOMAIN_ID
if user:
base['payload']['user'] = USER_ID
else:
base['payload']['group'] = GROUP_ID
return base
class TestCRUDNotification(base.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)
metadata = s.resource_metadata
self.assertEqual(PUBLISHER_ID, metadata.get('host'))
def _verify_common_operations(self, data, resource_type, operation,
resource_id):
self.assertEqual(1, len(data))
self.assertEqual(resource_id, data[0].resource_id)
name = '%s.%s.%s' % (notifications.SERVICE, resource_type, operation)
self.assertEqual(name, data[0].name)
def _test_operation(self, resource_type, operation, resource_id,
notification_class):
notif = notification_for(resource_type, operation, resource_id)
handler = notification_class(mock.Mock())
data = list(handler.process_notification(notif))
self.assertIsNone(data[0].user_id)
self._verify_common_operations(data, resource_type, operation,
resource_id)
self._verify_common_sample(data[0])
def _test_audit_operation(self, resource_type, operation, resource_id,
notification_class):
notif = cadf_crud_notification_for(resource_type, operation,
resource_id)
handler = notification_class(mock.Mock())
data = list(handler.process_notification(notif))
self.assertEqual(USER_ID, data[0].user_id)
self._verify_common_operations(data, resource_type, operation,
resource_id)
self._verify_common_sample(data[0])
def test_create_user(self):
self._test_operation('user', 'created', USER_ID, notifications.User)
self._test_audit_operation('user', 'created', USER_ID,
notifications.User)
def test_delete_user(self):
self._test_operation('user', 'deleted', USER_ID, notifications.User)
self._test_audit_operation('user', 'deleted', USER_ID,
notifications.User)
def test_update_user(self):
self._test_operation('user', 'updated', USER_ID, notifications.User)
self._test_audit_operation('user', 'updated', USER_ID,
notifications.User)
def test_create_group(self):
self._test_operation('group', 'created', GROUP_ID, notifications.Group)
self._test_audit_operation('group', 'created', GROUP_ID,
notifications.Group)
def test_update_group(self):
self._test_operation('group', 'updated', GROUP_ID, notifications.Group)
self._test_audit_operation('group', 'updated', GROUP_ID,
notifications.Group)
def test_delete_group(self):
self._test_operation('group', 'deleted', GROUP_ID, notifications.Group)
self._test_audit_operation('group', 'deleted', GROUP_ID,
notifications.Group)
def test_create_project(self):
self._test_operation('project', 'created', PROJECT_ID,
notifications.Project)
self._test_audit_operation('project', 'created', PROJECT_ID,
notifications.Project)
def test_update_project(self):
self._test_operation('project', 'updated', PROJECT_ID,
notifications.Project)
self._test_audit_operation('project', 'updated', PROJECT_ID,
notifications.Project)
def test_delete_project(self):
self._test_operation('project', 'deleted', PROJECT_ID,
notifications.Project)
self._test_audit_operation('project', 'deleted', PROJECT_ID,
notifications.Project)
def test_create_role(self):
self._test_operation('role', 'deleted', ROLE_ID, notifications.Role)
self._test_audit_operation('role', 'deleted', ROLE_ID,
notifications.Role)
def test_update_role(self):
self._test_operation('role', 'updated', ROLE_ID, notifications.Role)
self._test_audit_operation('role', 'updated', ROLE_ID,
notifications.Role)
def test_delete_role(self):
self._test_operation('role', 'deleted', ROLE_ID, notifications.Role)
self._test_audit_operation('role', 'deleted', ROLE_ID,
notifications.Role)
def test_create_trust(self):
self._test_operation('trust', 'created', TRUST_ID, notifications.Trust)
self._test_audit_operation('trust', 'created', TRUST_ID,
notifications.Trust)
def test_delete_trust(self):
self._test_operation('trust', 'deleted', TRUST_ID, notifications.Trust)
self._test_audit_operation('trust', 'deleted', TRUST_ID,
notifications.Trust)
class TestAuthenticationNotification(base.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(1, s.volume)
metadata = s.resource_metadata
self.assertEqual(PUBLISHER_ID, metadata.get('host'))
def _test_authn_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.assertEqual(USER_ID, data[0].resource_id)
self.assertEqual('user', data[0].unit)
self._verify_common_sample(data[0])
def _test_role_assignment_operation(self, action, project, user):
notif = notification_for_role_change(action, project, user)
handler = notifications.RoleAssignment(mock.Mock())
data = list(handler.process_notification(notif))
self.assertEqual(1, len(data))
name = '%s.%s.%s' % (notifications.SERVICE, ROLE_ASSIGNMENT, action)
self.assertEqual(name, data[0].name)
self.assertEqual(ROLE_ID, data[0].resource_id)
self.assertEqual(ROLE_ASSIGNMENT, data[0].unit)
metadata = data[0].resource_metadata
if project:
self.assertEqual(PROJECT_ID, metadata.get('project'))
else:
self.assertEqual(DOMAIN_ID, metadata.get('domain'))
if user:
self.assertEqual(USER_ID, metadata.get('user'))
else:
self.assertEqual(GROUP_ID, metadata.get('group'))
self._verify_common_sample(data[0])
def test_authn_success(self):
self._test_authn_operation('success')
def test_authn_failure(self):
self._test_authn_operation('failure')
def test_authn_pending(self):
self._test_authn_operation('pending')
def test_create_role_assignment_group_domain(self):
self._test_role_assignment_operation('created', False, False)
def test_delete_role_assignment_group_domain(self):
self._test_role_assignment_operation('deleted', False, False)
def test_create_role_assignment_user_project(self):
self._test_role_assignment_operation('created', True, True)
def test_delete_role_assignment_user_project(self):
self._test_role_assignment_operation('deleted', True, True)

View File

@ -150,3 +150,24 @@ class TestMeterProcessing(test.BaseTestCase):
self.__setup_meter_def_file(cfg)) self.__setup_meter_def_file(cfg))
c = list(self.handler.process_notification(NOTIFICATION)) c = list(self.handler.process_notification(NOTIFICATION))
self.assertEqual(1, len(c)) self.assertEqual(1, len(c))
def test_multi_match_event_meter(self):
cfg = yaml.dump(
{'metric': [dict(name="test1",
event_type="test.create",
type="delta",
unit="B",
volume="payload.volume",
resource_id="payload.resource_id",
project_id="payload.project_id"),
dict(name="test2",
event_type="test.create",
type="delta",
unit="B",
volume="payload.volume",
resource_id="payload.resource_id",
project_id="payload.project_id")]})
self.handler.definitions = notifications.load_definitions(
self.__setup_meter_def_file(cfg))
c = list(self.handler.process_notification(NOTIFICATION))
self.assertEqual(2, len(c))

View File

@ -1,345 +0,0 @@
# 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 datetime
import mock
from oslotest import base
from ceilometer import sample
from ceilometer.volume import notifications
def fake_uuid(x):
return '%s-%s-%s-%s' % (x * 8, x * 4, x * 4, x * 12)
NOW = datetime.datetime.isoformat(datetime.datetime.utcnow())
VOLUME_META = {u'status': u'exists',
u'instance_uuid': None,
u'user_id': u'bcb7746c7a41472d88a1ffac89ba6a9b',
u'availability_zone': u'nova',
u'tenant_id': u'7ffe17a15c724e2aa79fc839540aec15',
u'created_at': u'2014-10-28 09:31:20',
u'volume_id': fake_uuid('c'),
u'volume_type': u'3a9a398b-7e3b-40da-b09e-2115ad8cd68b',
u'replication_extended_status': None,
u'host': u'volumes.example.com',
u'snapshot_id': None,
u'replication_status': u'disabled',
u'size': 1,
u'display_name': u'2'}
NOTIFICATION_VOLUME_EXISTS = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.exists",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_CREATE_START = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.create.start",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_CREATE_END = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.create.end",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_DELETE_START = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.delete.start",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_DELETE_END = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.delete.end",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_RESIZE_START = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.resize.start",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_RESIZE_END = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.resize.end",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_ATTACH_START = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.attach.start",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_ATTACH_END = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.attach.end",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_DETACH_START = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.detach.start",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_DETACH_END = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.detach.end",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_UPDATE_START = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.update.start",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
NOTIFICATION_VOLUME_UPDATE_END = {
"message_id": "0c65cb9c-018c-11e2-bc91-5453ed1bbb5f",
"publisher_id": "volumes.example.com",
"event_type": "volume.update.end",
"priority": "info",
"payload": VOLUME_META,
"timestamp": NOW}
SNAPSHOT_META = {u'status': u'creating',
u'user_id': u'bcb7746c7a41472d88a1ffac89ba6a9b',
u'availability_zone': u'nova',
u'deleted': u'',
u'tenant_id': u'7ffe17a15c724e2aa79fc839540aec15',
u'created_at': u'2014-10-28 09:49:07',
u'snapshot_id': fake_uuid('c'),
u'volume_size': 1,
u'volume_id': u'2925bb3b-2b51-496a-bb6e-01a20e950e07',
u'display_name': u'11'}
NOTIFICATION_SNAPSHOT_EXISTS = {
"message_id": "1d2944f9-f8e9-4b2b-8df1-465f759a63e8",
"publisher_id": "snapshots.example.com",
"event_type": "snapshot.exists",
"priority": "info",
"payload": SNAPSHOT_META,
"timestamp": NOW}
NOTIFICATION_SNAPSHOT_CREATE_START = {
"message_id": "1d2944f9-f8e9-4b2b-8df1-465f759a63e8",
"publisher_id": "snapshots.example.com",
"event_type": "snapshot.create.start",
"priority": "info",
"payload": SNAPSHOT_META,
"timestamp": NOW}
NOTIFICATION_SNAPSHOT_CREATE_END = {
"message_id": "1d2944f9-f8e9-4b2b-8df1-465f759a63e8",
"publisher_id": "snapshots.example.com",
"event_type": "snapshot.create.end",
"priority": "info",
"payload": SNAPSHOT_META,
"timestamp": NOW}
NOTIFICATION_SNAPSHOT_DELETE_START = {
"message_id": "1d2944f9-f8e9-4b2b-8df1-465f759a63e8",
"publisher_id": "snapshots.example.com",
"event_type": "snapshot.delete.start",
"priority": "info",
"payload": SNAPSHOT_META,
"timestamp": NOW}
NOTIFICATION_SNAPSHOT_DELETE_END = {
"message_id": "1d2944f9-f8e9-4b2b-8df1-465f759a63e8",
"publisher_id": "snapshots.example.com",
"event_type": "snapshot.delete.end",
"priority": "info",
"payload": SNAPSHOT_META,
"timestamp": NOW}
class TestNotifications(base.BaseTestCase):
def setUp(self):
super(TestNotifications, self).setUp()
self.host = None
self.handler_crud = None
self.handler = None
self.handler_size = None
self.name = None
self.name_size = None
self.size = None
def _verify_common_counter(self, c, name, volume):
self.assertIsNotNone(c)
self.assertEqual(name, c.name)
self.assertEqual(fake_uuid('c'), c.resource_id)
self.assertEqual(NOW, c.timestamp)
self.assertEqual(volume, c.volume)
metadata = c.resource_metadata
self.assertEqual(self.host, metadata.get('host'))
def _check_crud(self, notification_type, notification_name):
counters = list(self.handler_crud.process_notification(
notification_type))
self.assertEqual(1, len(counters))
notification = counters[0]
self._verify_common_counter(
notification, notification_name, 1)
self.assertEqual(sample.TYPE_DELTA, notification.type)
def _check(self, notification_type):
counters = list(self.handler.process_notification(notification_type))
self.assertEqual(1, len(counters))
notification = counters[0]
self._verify_common_counter(notification, self.name, 1)
self.assertEqual(sample.TYPE_GAUGE, notification.type)
def _check_size(self, notification_type):
counters = list(self.handler_size.process_notification(
notification_type))
self.assertEqual(1, len(counters))
notification = counters[0]
self._verify_common_counter(
notification, self.name_size, self.size)
self.assertEqual(sample.TYPE_GAUGE, notification.type)
class TestVolumeNotifications(TestNotifications):
def setUp(self):
super(TestVolumeNotifications, self).setUp()
self.host = 'volumes.example.com'
self.handler_crud = notifications.VolumeCRUD(mock.Mock())
self.handler = notifications.Volume(mock.Mock())
self.handler_size = notifications.VolumeSize(mock.Mock())
self.name = 'volume'
self.name_size = 'volume.size'
self.size = VOLUME_META['size']
def test_volume_notifications(self):
self._check_crud(
NOTIFICATION_VOLUME_EXISTS, 'volume.exists')
self._check_crud(
NOTIFICATION_VOLUME_CREATE_START, 'volume.create.start')
self._check_crud(
NOTIFICATION_VOLUME_CREATE_END, 'volume.create.end')
self._check_crud(
NOTIFICATION_VOLUME_DELETE_START, 'volume.delete.start')
self._check_crud(
NOTIFICATION_VOLUME_DELETE_END, 'volume.delete.end')
self._check_crud(
NOTIFICATION_VOLUME_RESIZE_START, 'volume.resize.start')
self._check_crud(
NOTIFICATION_VOLUME_RESIZE_END, 'volume.resize.end')
self._check_crud(
NOTIFICATION_VOLUME_ATTACH_START, 'volume.attach.start')
self._check_crud(
NOTIFICATION_VOLUME_ATTACH_END, 'volume.attach.end')
self._check_crud(
NOTIFICATION_VOLUME_DETACH_START, 'volume.detach.start')
self._check_crud(
NOTIFICATION_VOLUME_DETACH_END, 'volume.detach.end')
self._check_crud(
NOTIFICATION_VOLUME_UPDATE_START, 'volume.update.start')
self._check_crud(
NOTIFICATION_VOLUME_UPDATE_END, 'volume.update.end')
self._check(NOTIFICATION_VOLUME_EXISTS)
self._check(NOTIFICATION_VOLUME_CREATE_START)
self._check(NOTIFICATION_VOLUME_CREATE_END)
self._check(NOTIFICATION_VOLUME_DELETE_START)
self._check(NOTIFICATION_VOLUME_DELETE_END)
self._check(NOTIFICATION_VOLUME_RESIZE_START)
self._check(NOTIFICATION_VOLUME_RESIZE_END)
self._check(NOTIFICATION_VOLUME_ATTACH_START)
self._check(NOTIFICATION_VOLUME_ATTACH_END)
self._check(NOTIFICATION_VOLUME_DETACH_START)
self._check(NOTIFICATION_VOLUME_DETACH_END)
self._check(NOTIFICATION_VOLUME_UPDATE_START)
self._check(NOTIFICATION_VOLUME_UPDATE_END)
self._check_size(NOTIFICATION_VOLUME_EXISTS)
self._check_size(NOTIFICATION_VOLUME_CREATE_START)
self._check_size(NOTIFICATION_VOLUME_CREATE_END)
self._check_size(NOTIFICATION_VOLUME_DELETE_START)
self._check_size(NOTIFICATION_VOLUME_DELETE_END)
self._check_size(NOTIFICATION_VOLUME_RESIZE_START)
self._check_size(NOTIFICATION_VOLUME_RESIZE_END)
self._check_size(NOTIFICATION_VOLUME_ATTACH_START)
self._check_size(NOTIFICATION_VOLUME_ATTACH_END)
self._check_size(NOTIFICATION_VOLUME_DETACH_START)
self._check_size(NOTIFICATION_VOLUME_DETACH_END)
self._check_size(NOTIFICATION_VOLUME_UPDATE_START)
self._check_size(NOTIFICATION_VOLUME_UPDATE_END)
class TestSnapshotNotifications(TestNotifications):
def setUp(self):
super(TestSnapshotNotifications, self).setUp()
self.host = 'snapshots.example.com'
self.handler_crud = notifications.SnapshotCRUD(mock.Mock())
self.handler = notifications.Snapshot(mock.Mock())
self.handler_size = notifications.SnapshotSize(mock.Mock())
self.name = 'snapshot'
self.name_size = 'snapshot.size'
self.size = SNAPSHOT_META['volume_size']
def test_snapshot_notifications(self):
self._check_crud(
NOTIFICATION_SNAPSHOT_EXISTS, 'snapshot.exists')
self._check_crud(
NOTIFICATION_SNAPSHOT_CREATE_START, 'snapshot.create.start')
self._check_crud(
NOTIFICATION_SNAPSHOT_CREATE_END, 'snapshot.create.end')
self._check_crud(
NOTIFICATION_SNAPSHOT_DELETE_START, 'snapshot.delete.start')
self._check_crud(
NOTIFICATION_SNAPSHOT_DELETE_END, 'snapshot.delete.end')
self._check(NOTIFICATION_SNAPSHOT_EXISTS)
self._check(NOTIFICATION_SNAPSHOT_CREATE_START)
self._check(NOTIFICATION_SNAPSHOT_CREATE_END)
self._check(NOTIFICATION_SNAPSHOT_DELETE_START)
self._check(NOTIFICATION_SNAPSHOT_DELETE_END)
self._check_size(NOTIFICATION_SNAPSHOT_EXISTS)
self._check_size(NOTIFICATION_SNAPSHOT_CREATE_START)
self._check_size(NOTIFICATION_SNAPSHOT_CREATE_END)
self._check_size(NOTIFICATION_SNAPSHOT_DELETE_START)
self._check_size(NOTIFICATION_SNAPSHOT_DELETE_END)

View File

@ -1,149 +0,0 @@
#
# Copyright 2012 New Dream Network, LLC (DreamHost)
#
# 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.
"""Converters for producing volume counter messages from cinder notification
events.
"""
from oslo_config import cfg
import oslo_messaging
from ceilometer.agent import plugin_base
from ceilometer import sample
OPTS = [
cfg.StrOpt('cinder_control_exchange',
default='cinder',
help="Exchange name for Cinder notifications."),
]
cfg.CONF.register_opts(OPTS)
class VolumeBase(plugin_base.NotificationBase):
"""Convert volume/snapshot notification into Counters."""
@staticmethod
def get_targets(conf):
"""Return a sequence of oslo.messaging.Target
Sequence defining the exchange and topics to be connected for this
plugin.
"""
return [oslo_messaging.Target(topic=topic,
exchange=conf.cinder_control_exchange)
for topic in conf.notification_topics]
class VolumeCRUDBase(VolumeBase):
"""Convert volume notifications into Counters."""
event_types = [
'volume.exists',
'volume.create.*',
'volume.delete.*',
'volume.resize.*',
'volume.attach.*',
'volume.detach.*',
'volume.update.*'
]
class VolumeCRUD(VolumeCRUDBase, plugin_base.NonMetricNotificationBase):
def process_notification(self, message):
yield sample.Sample.from_notification(
name=message['event_type'],
type=sample.TYPE_DELTA,
unit='volume',
volume=1,
user_id=message['payload']['user_id'],
project_id=message['payload']['tenant_id'],
resource_id=message['payload']['volume_id'],
message=message)
class Volume(VolumeCRUDBase, plugin_base.NonMetricNotificationBase):
def process_notification(self, message):
yield sample.Sample.from_notification(
name='volume',
type=sample.TYPE_GAUGE,
unit='volume',
volume=1,
user_id=message['payload']['user_id'],
project_id=message['payload']['tenant_id'],
resource_id=message['payload']['volume_id'],
message=message)
class VolumeSize(VolumeCRUDBase):
def process_notification(self, message):
yield sample.Sample.from_notification(
name='volume.size',
type=sample.TYPE_GAUGE,
unit='GB',
volume=message['payload']['size'],
user_id=message['payload']['user_id'],
project_id=message['payload']['tenant_id'],
resource_id=message['payload']['volume_id'],
message=message)
class SnapshotCRUDBase(VolumeBase):
"""Convert snapshot notifications into Counters."""
event_types = [
'snapshot.exists',
'snapshot.create.*',
'snapshot.delete.*',
]
class SnapshotCRUD(SnapshotCRUDBase, plugin_base.NonMetricNotificationBase):
def process_notification(self, message):
yield sample.Sample.from_notification(
name=message['event_type'],
type=sample.TYPE_DELTA,
unit='snapshot',
volume=1,
user_id=message['payload']['user_id'],
project_id=message['payload']['tenant_id'],
resource_id=message['payload']['snapshot_id'],
message=message)
class Snapshot(SnapshotCRUDBase, plugin_base.NonMetricNotificationBase):
def process_notification(self, message):
yield sample.Sample.from_notification(
name='snapshot',
type=sample.TYPE_GAUGE,
unit='snapshot',
volume=1,
user_id=message['payload']['user_id'],
project_id=message['payload']['tenant_id'],
resource_id=message['payload']['snapshot_id'],
message=message)
class SnapshotSize(SnapshotCRUDBase):
def process_notification(self, message):
yield sample.Sample.from_notification(
name='snapshot.size',
type=sample.TYPE_GAUGE,
unit='GB',
volume=message['payload']['volume_size'],
user_id=message['payload']['user_id'],
project_id=message['payload']['tenant_id'],
resource_id=message['payload']['snapshot_id'],
message=message)

View File

@ -46,19 +46,6 @@ ceilometer.notification =
cpu_user_percent = ceilometer.compute.notifications.cpu:CpuUserPercent cpu_user_percent = ceilometer.compute.notifications.cpu:CpuUserPercent
cpu_iowait_percent = ceilometer.compute.notifications.cpu:CpuIowaitPercent cpu_iowait_percent = ceilometer.compute.notifications.cpu:CpuIowaitPercent
cpu_percent = ceilometer.compute.notifications.cpu:CpuPercent cpu_percent = ceilometer.compute.notifications.cpu:CpuPercent
volume = ceilometer.volume.notifications:Volume
volume_size = ceilometer.volume.notifications:VolumeSize
volume_crud = ceilometer.volume.notifications:VolumeCRUD
snapshot = ceilometer.volume.notifications:Snapshot
snapshot_size = ceilometer.volume.notifications:SnapshotSize
snapshot_crud = ceilometer.volume.notifications:SnapshotCRUD
authenticate = ceilometer.identity.notifications:Authenticate
user = ceilometer.identity.notifications:User
group = ceilometer.identity.notifications:Group
role = ceilometer.identity.notifications:Role
project = ceilometer.identity.notifications:Project
trust = ceilometer.identity.notifications:Trust
role_assignment = ceilometer.identity.notifications:RoleAssignment
network = ceilometer.network.notifications:Network network = ceilometer.network.notifications:Network
subnet = ceilometer.network.notifications:Subnet subnet = ceilometer.network.notifications:Subnet
port = ceilometer.network.notifications:Port port = ceilometer.network.notifications:Port
@ -67,7 +54,6 @@ ceilometer.notification =
bandwidth = ceilometer.network.notifications:Bandwidth bandwidth = ceilometer.network.notifications:Bandwidth
http.request = ceilometer.middleware:HTTPRequest http.request = ceilometer.middleware:HTTPRequest
http.response = ceilometer.middleware:HTTPResponse http.response = ceilometer.middleware:HTTPResponse
data_processing = ceilometer.data_processing.notifications:DataProcessing
profiler = ceilometer.profiler.notifications:ProfilerNotifications profiler = ceilometer.profiler.notifications:ProfilerNotifications
hardware.ipmi.temperature = ceilometer.ipmi.notifications.ironic:TemperatureSensorNotification hardware.ipmi.temperature = ceilometer.ipmi.notifications.ironic:TemperatureSensorNotification
hardware.ipmi.voltage = ceilometer.ipmi.notifications.ironic:VoltageSensorNotification hardware.ipmi.voltage = ceilometer.ipmi.notifications.ironic:VoltageSensorNotification