From 201b3ef52280bd245d04550254e225e13faf8ee6 Mon Sep 17 00:00:00 2001 From: Pradeep Kilambi Date: Thu, 16 Jul 2015 18:17:08 -0400 Subject: [PATCH] Convert identity, sahara and volume to meters yaml Change-Id: Ica102ab3a003f4a7d84ad435c00993d5d81db767 --- ceilometer/data_processing/__init__.py | 0 ceilometer/data_processing/notifications.py | 71 --- ceilometer/exchange_control.py | 9 + ceilometer/identity/__init__.py | 0 ceilometer/identity/notifications.py | 172 ------- ceilometer/meter/data/meters.yaml | 445 +++++++++++++++++- ceilometer/middleware.py | 2 +- ceilometer/opts.py | 8 +- ceilometer/profiler/notifications.py | 2 +- .../data_processing/test_notifications.py | 101 ---- .../tests/unit/identity/test_notifications.py | 310 ------------ .../tests/unit/meter/test_notifications.py | 21 + .../tests/unit/volume/test_notifications.py | 345 -------------- ceilometer/volume/__init__.py | 0 ceilometer/volume/notifications.py | 149 ------ setup.cfg | 14 - 16 files changed, 475 insertions(+), 1174 deletions(-) delete mode 100644 ceilometer/data_processing/__init__.py delete mode 100644 ceilometer/data_processing/notifications.py delete mode 100644 ceilometer/identity/__init__.py delete mode 100644 ceilometer/identity/notifications.py delete mode 100644 ceilometer/tests/unit/data_processing/test_notifications.py delete mode 100644 ceilometer/tests/unit/identity/test_notifications.py delete mode 100644 ceilometer/tests/unit/volume/test_notifications.py delete mode 100644 ceilometer/volume/__init__.py delete mode 100644 ceilometer/volume/notifications.py diff --git a/ceilometer/data_processing/__init__.py b/ceilometer/data_processing/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ceilometer/data_processing/notifications.py b/ceilometer/data_processing/notifications.py deleted file mode 100644 index 1b328c25..00000000 --- a/ceilometer/data_processing/notifications.py +++ /dev/null @@ -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) diff --git a/ceilometer/exchange_control.py b/ceilometer/exchange_control.py index 6a9b130f..2639b5eb 100644 --- a/ceilometer/exchange_control.py +++ b/ceilometer/exchange_control.py @@ -23,4 +23,13 @@ EXCHANGE_OPTS = [ cfg.StrOpt('magnetodb_control_exchange', default='magnetodb', 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."), ] diff --git a/ceilometer/identity/__init__.py b/ceilometer/identity/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ceilometer/identity/notifications.py b/ceilometer/identity/notifications.py deleted file mode 100644 index 8bfea9c4..00000000 --- a/ceilometer/identity/notifications.py +++ /dev/null @@ -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, - ] diff --git a/ceilometer/meter/data/meters.yaml b/ceilometer/meter/data/meters.yaml index 4abda079..8076ebc1 100644 --- a/ceilometer/meter/data/meters.yaml +++ b/ceilometer/meter/data/meters.yaml @@ -39,6 +39,33 @@ metric: resource_id: payload.table_uuid 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 # These are expected to be DEPRECATED in future releases @@ -46,9 +73,9 @@ metric: # Image - name: "image" event_type: - - "image.upload" - - "image.delete" - - "image.update" + - "image.upload" + - "image.delete" + - "image.update" type: "gauge" unit: 'image' volume: 1 @@ -124,3 +151,415 @@ metric: resource_id: payload.table_uuid user_id: _context_user 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 diff --git a/ceilometer/middleware.py b/ceilometer/middleware.py index 0cb1eebe..8fa9456a 100644 --- a/ceilometer/middleware.py +++ b/ceilometer/middleware.py @@ -26,7 +26,7 @@ cfg.CONF.import_opt('glance_control_exchange', cfg.CONF.import_opt('neutron_control_exchange', 'ceilometer.network.notifications') cfg.CONF.import_opt('cinder_control_exchange', - 'ceilometer.volume.notifications') + 'ceilometer.notification') OPTS = [ cfg.MultiStrOpt('http_control_exchanges', diff --git a/ceilometer/opts.py b/ceilometer/opts.py index 77c5ef80..0119f766 100644 --- a/ceilometer/opts.py +++ b/ceilometer/opts.py @@ -30,13 +30,11 @@ import ceilometer.compute.virt.libvirt.inspector import ceilometer.compute.virt.vmware.inspector import ceilometer.compute.virt.xenapi.inspector import ceilometer.coordination -import ceilometer.data_processing.notifications import ceilometer.dispatcher import ceilometer.dispatcher.file import ceilometer.energy.kwapi import ceilometer.event.converter import ceilometer.hardware.discovery -import ceilometer.identity.notifications import ceilometer.image.glance import ceilometer.ipmi.notifications.ironic import ceilometer.ipmi.platform.intel_node_manager @@ -56,7 +54,6 @@ import ceilometer.sample import ceilometer.service import ceilometer.storage import ceilometer.utils -import ceilometer.volume.notifications def list_opts(): @@ -69,9 +66,7 @@ def list_opts(): ceilometer.compute.util.OPTS, ceilometer.compute.virt.inspector.OPTS, ceilometer.compute.virt.libvirt.inspector.OPTS, - ceilometer.data_processing.notifications.OPTS, ceilometer.dispatcher.OPTS, - ceilometer.identity.notifications.OPTS, ceilometer.image.glance.OPTS, ceilometer.ipmi.notifications.ironic.OPTS, ceilometer.middleware.OPTS, @@ -83,8 +78,7 @@ def list_opts(): ceilometer.sample.OPTS, ceilometer.service.OPTS, ceilometer.storage.OLD_OPTS, - ceilometer.utils.OPTS, - ceilometer.volume.notifications.OPTS,)), + ceilometer.utils.OPTS,)), ('alarm', itertools.chain(ceilometer.alarm.notifier.rest.OPTS, ceilometer.alarm.service.OPTS, diff --git a/ceilometer/profiler/notifications.py b/ceilometer/profiler/notifications.py index 8ff16188..2f15d4b4 100644 --- a/ceilometer/profiler/notifications.py +++ b/ceilometer/profiler/notifications.py @@ -32,7 +32,7 @@ OPTS = [ cfg.CONF.register_opts(OPTS) # TODO(boris-42): remove after adding keystone audit plugins. cfg.CONF.import_opt('keystone_control_exchange', - 'ceilometer.identity.notifications') + 'ceilometer.notification') class ProfilerNotifications(plugin_base.NotificationBase, diff --git a/ceilometer/tests/unit/data_processing/test_notifications.py b/ceilometer/tests/unit/data_processing/test_notifications.py deleted file mode 100644 index c6e872b5..00000000 --- a/ceilometer/tests/unit/data_processing/test_notifications.py +++ /dev/null @@ -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') diff --git a/ceilometer/tests/unit/identity/test_notifications.py b/ceilometer/tests/unit/identity/test_notifications.py deleted file mode 100644 index 9756b8f9..00000000 --- a/ceilometer/tests/unit/identity/test_notifications.py +++ /dev/null @@ -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) diff --git a/ceilometer/tests/unit/meter/test_notifications.py b/ceilometer/tests/unit/meter/test_notifications.py index d5d85acd..e33ed878 100644 --- a/ceilometer/tests/unit/meter/test_notifications.py +++ b/ceilometer/tests/unit/meter/test_notifications.py @@ -150,3 +150,24 @@ class TestMeterProcessing(test.BaseTestCase): self.__setup_meter_def_file(cfg)) c = list(self.handler.process_notification(NOTIFICATION)) 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)) diff --git a/ceilometer/tests/unit/volume/test_notifications.py b/ceilometer/tests/unit/volume/test_notifications.py deleted file mode 100644 index f22d5b26..00000000 --- a/ceilometer/tests/unit/volume/test_notifications.py +++ /dev/null @@ -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) diff --git a/ceilometer/volume/__init__.py b/ceilometer/volume/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ceilometer/volume/notifications.py b/ceilometer/volume/notifications.py deleted file mode 100644 index 39abf1c6..00000000 --- a/ceilometer/volume/notifications.py +++ /dev/null @@ -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) diff --git a/setup.cfg b/setup.cfg index 7b4d2cb5..568a62c3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -46,19 +46,6 @@ ceilometer.notification = cpu_user_percent = ceilometer.compute.notifications.cpu:CpuUserPercent cpu_iowait_percent = ceilometer.compute.notifications.cpu:CpuIowaitPercent 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 subnet = ceilometer.network.notifications:Subnet port = ceilometer.network.notifications:Port @@ -67,7 +54,6 @@ ceilometer.notification = bandwidth = ceilometer.network.notifications:Bandwidth http.request = ceilometer.middleware:HTTPRequest http.response = ceilometer.middleware:HTTPResponse - data_processing = ceilometer.data_processing.notifications:DataProcessing profiler = ceilometer.profiler.notifications:ProfilerNotifications hardware.ipmi.temperature = ceilometer.ipmi.notifications.ironic:TemperatureSensorNotification hardware.ipmi.voltage = ceilometer.ipmi.notifications.ironic:VoltageSensorNotification