From 9a31307470834a58c9ede46f5fa0b173604f7e2c Mon Sep 17 00:00:00 2001 From: Deklan Dieterly Date: Fri, 7 Nov 2014 14:34:34 -0700 Subject: [PATCH] Add Alarms resources files Change-Id: If2305a636b0b5eedc09a8f49ab9466c7bcc476ed --- etc/monasca.conf | 3 + monasca/api/alarms_api_v2.py | 44 +++++++++++ monasca/api/monasca_api_v2.py | 18 ----- monasca/api/server.py | 24 ++++-- .../common/repositories/alarms_repository.py | 20 +++++ .../mysql/alarm_definitions_repository.py | 33 +------- .../repositories/mysql/alarms_repository.py | 33 ++++++++ .../repositories/mysql/mysql_repository.py | 62 +++++++++++++++ monasca/v2/reference/alarms.py | 78 +++++++++++++++++++ setup.cfg | 1 + 10 files changed, 261 insertions(+), 55 deletions(-) create mode 100644 monasca/api/alarms_api_v2.py create mode 100644 monasca/common/repositories/alarms_repository.py create mode 100644 monasca/common/repositories/mysql/alarms_repository.py create mode 100644 monasca/common/repositories/mysql/mysql_repository.py create mode 100644 monasca/v2/reference/alarms.py diff --git a/etc/monasca.conf b/etc/monasca.conf index 0b08dde..018ee91 100644 --- a/etc/monasca.conf +++ b/etc/monasca.conf @@ -42,6 +42,9 @@ transforms_driver = mysql_transforms_repo # The driver to use for the alarm definitions repository alarm_definitions_driver = mysql_alarm_definitions_repo +# The driver to use for the alarms repository +alarms_driver = mysql_alarms_repo + # The driver to use for the notifications repository notifications_driver = mysql_notifications_repo diff --git a/monasca/api/alarms_api_v2.py b/monasca/api/alarms_api_v2.py new file mode 100644 index 0000000..10b8241 --- /dev/null +++ b/monasca/api/alarms_api_v2.py @@ -0,0 +1,44 @@ +# Copyright 2014 Hewlett-Packard +# +# 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 monasca.common import resource_api +from monasca.openstack.common import log + +LOG = log.getLogger(__name__) + + +class AlarmsV2API(object): + + def __init__(self, global_conf): + LOG.debug('initializing AlarmsV2API!') + self.global_conf = global_conf + + @resource_api.Restify('/v2.0/alarms/{id}', method='put') + def do_put_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/{id}', method='patch') + def do_patch_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/{id}', method='delete') + def do_delete_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/', method='get') + def do_get_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/{id}', method='get') + def do_get_alarm_by_id(self, req, res, id): + res.status = '501 Not Implemented' diff --git a/monasca/api/monasca_api_v2.py b/monasca/api/monasca_api_v2.py index 3e1cd11..16a5fb6 100644 --- a/monasca/api/monasca_api_v2.py +++ b/monasca/api/monasca_api_v2.py @@ -46,25 +46,7 @@ class V2API(object): def do_get_statistics(self, req, res): res.status = '501 Not Implemented' - @resource_api.Restify('/v2.0/alarms/{id}', method='put') - def do_put_alarms(self, req, res, id): - res.status = '501 Not Implemented' - @resource_api.Restify('/v2.0/alarms/{id}', method='patch') - def do_patch_alarms(self, req, res, id): - res.status = '501 Not Implemented' - - @resource_api.Restify('/v2.0/alarms/{id}', method='delete') - def do_delete_alarms(self, req, res, id): - res.status = '501 Not Implemented' - - @resource_api.Restify('/v2.0/alarms/', method='get') - def do_get_alarms(self, req, res, id): - res.status = '501 Not Implemented' - - @resource_api.Restify('/v2.0/alarms/{id}', method='get') - def do_get_alarm_by_id(self, req, res, id): - res.status = '501 Not Implemented' @resource_api.Restify('/v2.0/alarms/state-history', method='get') def do_get_alarms_state_history(self, req, res, id): diff --git a/monasca/api/server.py b/monasca/api/server.py index 77824e1..7bb664c 100644 --- a/monasca/api/server.py +++ b/monasca/api/server.py @@ -25,6 +25,7 @@ from wsgiref import simple_server METRICS_DISPATCHER_NAMESPACE = 'monasca.metrics_dispatcher' ALARM_DEFINITIONS_DISPATCHER_NAMESPACE = 'monasca.alarm_definitions_dispatcher' +ALARMS_DISPATCHER_NAMESPACE = 'monasca.alarms_dispatcher' EVENTS_DISPATCHER_NAMESPACE = 'monasca.events_dispatcher' TRANSFORMS_DISPATCHER_NAMESPACE = 'monasca.transforms_dispatcher' NOTIFICATIONS_DISPATCHER_NAMESPACE = 'monasca.notifications_dispatcher' @@ -68,6 +69,8 @@ repositories_opts = [ cfg.StrOpt('alarm_definitions_driver', default='mysql_alarm_definitions_repo', help='The repository driver to use for alarm definitions'), + cfg.StrOpt('alarms_driver', default='mysql_alarms_repo', + help='The repository driver to use for alarms'), cfg.StrOpt('events_driver', default='fake_events_repo', help='The repository driver to use for events'), cfg.StrOpt('transforms_driver', default='mysql_transforms_repo', @@ -97,9 +100,9 @@ kafka_opts = [cfg.StrOpt('uri', help='Address to kafka server. For example: ' help='The group name that this service belongs to.'), cfg.IntOpt('wait_time', default=1, help='The wait time when no messages on kafka ' - 'queue.'), - cfg.IntOpt('ack_time', default=20, - help='The ack time back to kafka.'), + 'queue.'), cfg.IntOpt('ack_time', default=20, + help='The ack time back ' + 'to kafka.'), cfg.IntOpt('max_retry', default=3, help='The number of retry when there is a ' 'connection error.'), @@ -108,16 +111,16 @@ kafka_opts = [cfg.StrOpt('uri', help='Address to kafka server. For example: ' 'messages.'), cfg.BoolOpt('async', default=True, help='The type of posting.'), cfg.BoolOpt('compact', default=True, help=( - 'Specify if the message received should be parsed.' - 'If True, message will not be parsed, otherwise ' - 'messages will be parsed.')), + 'Specify if the message received should be parsed.' + 'If True, message will not be parsed, otherwise ' + 'messages will be parsed.')), cfg.MultiOpt('partitions', item_type=types.Integer(), default=[0], help='The sleep time when no messages on kafka ' 'queue.'), cfg.BoolOpt('drop_data', default=False, help=( - 'Specify if received data should be simply dropped. ' - 'This parameter is only for testing purposes.')), ] + 'Specify if received data should be simply dropped. ' + 'This parameter is only for testing purposes.')), ] kafka_group = cfg.OptGroup(name='kafka', title='title') cfg.CONF.register_group(kafka_group) @@ -171,6 +174,11 @@ def api_app(conf): ALARM_DEFINITIONS_DISPATCHER_NAMESPACE, cfg.CONF.dispatcher.driver, [conf]) + # load the alarm definitions resource + app.add_resource('alarms', + ALARM_DEFINITIONS_DISPATCHER_NAMESPACE, + cfg.CONF.dispatcher.driver, [conf]) + return app diff --git a/monasca/common/repositories/alarms_repository.py b/monasca/common/repositories/alarms_repository.py new file mode 100644 index 0000000..1161861 --- /dev/null +++ b/monasca/common/repositories/alarms_repository.py @@ -0,0 +1,20 @@ +# Copyright 2014 Hewlett-Packard +# +# 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 abc +import six + + +@six.add_metaclass(abc.ABCMeta) +class AlarmsRepository(object): + pass diff --git a/monasca/common/repositories/mysql/alarm_definitions_repository.py b/monasca/common/repositories/mysql/alarm_definitions_repository.py index 170574c..df8ffbb 100644 --- a/monasca/common/repositories/mysql/alarm_definitions_repository.py +++ b/monasca/common/repositories/mysql/alarm_definitions_repository.py @@ -17,6 +17,7 @@ import pyodbc from oslo.config import cfg from monasca.common.repositories import alarm_definitions_repository +from monasca.common.repositories.mysql.mysql_repository import MySQLRepository from monasca.openstack.common import log from monasca.openstack.common import uuidutils from monasca.common.repositories import exceptions @@ -25,40 +26,14 @@ from monasca.common.repositories import exceptions LOG = log.getLogger(__name__) -class AlarmDefinitionsRepository( +class AlarmDefinitionsRepository(MySQLRepository, alarm_definitions_repository.AlarmDefinitionsRepository): - database_driver = 'MySQL ODBC 5.3 ANSI Driver' - database_cnxn_template = 'DRIVER={' \ - '%s};Server=%s;CHARSET=UTF8;Database=%s;Uid=%s' \ - ';Pwd=%s' + def __init__(self): - try: - self.conf = cfg.CONF - database_name = self.conf.mysql.database_name - database_server = self.conf.mysql.hostname - database_uid = self.conf.mysql.username - database_pwd = self.conf.mysql.password - self._cnxn_string = ( - AlarmDefinitionsRepository.database_cnxn_template % ( - AlarmDefinitionsRepository.database_driver, - database_server, database_name, database_uid, - database_pwd)) + super(AlarmDefinitionsRepository, self).__init__() - except Exception as ex: - LOG.exception(ex) - raise exceptions.RepositoryException(ex) - - def _get_cnxn_cursor_tuple(self): - - cnxn = pyodbc.connect(self._cnxn_string) - cursor = cnxn.cursor() - return cnxn, cursor - - def _commit_close_cnxn(self, cnxn): - cnxn.commit() - cnxn.close() def get_alarm_definition_list(self, tenant_id, name, dimensions): diff --git a/monasca/common/repositories/mysql/alarms_repository.py b/monasca/common/repositories/mysql/alarms_repository.py new file mode 100644 index 0000000..478e0a5 --- /dev/null +++ b/monasca/common/repositories/mysql/alarms_repository.py @@ -0,0 +1,33 @@ +# Copyright 2014 Hewlett-Packard +# +# 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 pyodbc + +from oslo.config import cfg + +from monasca.common.repositories import alarms_repository +from monasca.common.repositories.mysql.mysql_repository import MySQLRepository +from monasca.openstack.common import log + + +LOG = log.getLogger(__name__) + + +class AlarmsRepository(MySQLRepository, alarms_repository.AlarmsRepository): + + def __init__(self): + + + super(AlarmsRepository, self).__init__() + diff --git a/monasca/common/repositories/mysql/mysql_repository.py b/monasca/common/repositories/mysql/mysql_repository.py new file mode 100644 index 0000000..2e8c3e7 --- /dev/null +++ b/monasca/common/repositories/mysql/mysql_repository.py @@ -0,0 +1,62 @@ +# Copyright 2014 Hewlett-Packard +# +# 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 pyodbc + +from oslo.config import cfg + +from monasca.common.repositories import alarms_repository +from monasca.openstack.common import log +from monasca.openstack.common import uuidutils +from monasca.common.repositories import exceptions + + +LOG = log.getLogger(__name__) + + +class MySQLRepository(object): + + database_driver = 'MySQL ODBC 5.3 ANSI Driver' + database_cnxn_template = 'DRIVER={' \ + '%s};Server=%s;CHARSET=UTF8;Database=%s;Uid=%s' \ + ';Pwd=%s' + + def __init__(self): + + try: + self.conf = cfg.CONF + database_name = self.conf.mysql.database_name + database_server = self.conf.mysql.hostname + database_uid = self.conf.mysql.username + database_pwd = self.conf.mysql.password + self._cnxn_string = ( + MySQLRepository.database_cnxn_template % ( + MySQLRepository.database_driver, + database_server, database_name, database_uid, + database_pwd)) + + except Exception as ex: + LOG.exception(ex) + raise exceptions.RepositoryException(ex) + + def _get_cnxn_cursor_tuple(self): + + cnxn = pyodbc.connect(self._cnxn_string) + cursor = cnxn.cursor() + return cnxn, cursor + + def _commit_close_cnxn(self, cnxn): + cnxn.commit() + cnxn.close() + diff --git a/monasca/v2/reference/alarms.py b/monasca/v2/reference/alarms.py new file mode 100644 index 0000000..80f9c91 --- /dev/null +++ b/monasca/v2/reference/alarms.py @@ -0,0 +1,78 @@ +# Copyright 2014 Hewlett-Packard +# +# 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 json + +from pyparsing import ParseException +import falcon +from oslo.config import cfg +from monasca.api.alarms_api_v2 import AlarmsV2API + +from monasca.common.repositories import exceptions +from monasca.common import resource_api +from monasca.api.alarm_definitions_api_v2 import AlarmDefinitionsV2API +from monasca.expression_parser.alarm_expr_parser import AlarmExprParser +from monasca.openstack.common import log +from monasca.v2.reference import helpers +from monasca.v2.common.schemas import alarm_definition_request_body_schema as schema_alarms +from monasca.v2.common.schemas import exceptions as schemas_exceptions +from monasca.v2.reference.helpers import read_json_msg_body +from monasca.common.messaging import exceptions as message_queue_exceptions + + +LOG = log.getLogger(__name__) + + +class Alarms(AlarmsV2API): + def __init__(self, global_conf): + try: + super(Alarms, self).__init__(global_conf) + + self._region = cfg.CONF.region + + self._default_authorized_roles = cfg.CONF.security.default_authorized_roles + self._delegate_authorized_roles = cfg.CONF.security.delegate_authorized_roles + self._post_metrics_authorized_roles = cfg.CONF.security.default_authorized_roles + cfg.CONF.security.agent_authorized_roles + + self._message_queue = resource_api.init_driver('monasca.messaging', + cfg.CONF.messaging.driver, + (['events'])) + + self._alarms_repo = resource_api.init_driver( + 'monasca.repositories', + cfg.CONF.repositories.alarms_driver) + + except Exception as ex: + LOG.exception(ex) + raise exceptions.RepositoryException(ex) + + + @resource_api.Restify('/v2.0/alarms/{id}', method='put') + def do_put_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/{id}', method='patch') + def do_patch_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/{id}', method='delete') + def do_delete_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/', method='get') + def do_get_alarms(self, req, res, id): + res.status = '501 Not Implemented' + + @resource_api.Restify('/v2.0/alarms/{id}', method='get') + def do_get_alarm_by_id(self, req, res, id): + res.status = '501 Not Implemented' diff --git a/setup.cfg b/setup.cfg index 99d9f57..5f60787 100644 --- a/setup.cfg +++ b/setup.cfg @@ -66,6 +66,7 @@ monasca.repositories = fake_events_repo = monasca.common.repositories.fake.events_repository:EventsRepository mysql_transforms_repo = monasca.common.repositories.mysql.transforms_repository:TransformsRepository mysql_alarm_definitions_repo = monasca.common.repositories.mysql.alarm_definitions_repository:AlarmDefinitionsRepository + mysql_alarms_repo = monasca.common.repositories.mysql.alarms_repository:AlarmsRepository mysql_notifications_repo = monasca.common.repositories.mysql.notifications_repository:NotificationsRepository [pbr]