
Notifications are temporary data structure, so save it in memory instead of object store, allowing it to work even when there is no disk space. Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- src/wok/control/notifications.py | 6 +++++ src/wok/model/notifications.py | 52 +++++++++++++++++++++++++++++----------- src/wok/objectstore.py | 36 ---------------------------- src/wok/server.py | 4 ---- 4 files changed, 44 insertions(+), 54 deletions(-) diff --git a/src/wok/control/notifications.py b/src/wok/control/notifications.py index 37d45f2..b57595e 100644 --- a/src/wok/control/notifications.py +++ b/src/wok/control/notifications.py @@ -21,6 +21,11 @@ from wok.control.base import Collection, Resource from wok.control.utils import UrlSubNode +NOTIFICATION_REQUESTS = { + 'DELETE': {'default': "UI notification deleted: %(ident)s"}, +} + + @UrlSubNode('notifications', True) class Notifications(Collection): def __init__(self, model): @@ -31,6 +36,7 @@ class Notifications(Collection): class Notification(Resource): def __init__(self, model, id): super(Notification, self).__init__(model, id) + self.log_map = NOTIFICATION_REQUESTS @property def data(self): diff --git a/src/wok/model/notifications.py b/src/wok/model/notifications.py index 77184db..79bed03 100644 --- a/src/wok/model/notifications.py +++ b/src/wok/model/notifications.py @@ -17,40 +17,64 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +from datetime import datetime + from wok.exception import NotFoundError, OperationFailed from wok.message import WokMessage +from wok.utils import wok_log + + +notificationsStore = {} + + +def add_notification(code, args={}, plugin_name=None): + if not code: + wok_log.error("Unable to add notification: invalid code '%(code)s'" % + {'code': str(code)}) + return + + global notificationsStore + notification = notificationsStore.get(code) + + # do not update timestamp if notification already exists + timestamp = datetime.now().isoformat() if notification is None else \ + notification['timestamp'] + + args.update({"_plugin_name": plugin_name, "timestamp": timestamp}) + notificationsStore[code] = args class NotificationsModel(object): def __init__(self, **kargs): - self.objstore = kargs['objstore'] + pass def get_list(self): - with self.objstore as session: - return session.get_list('notification') + global notificationsStore + return notificationsStore.keys() class NotificationModel(object): def __init__(self, **kargs): - self.objstore = kargs['objstore'] + pass def lookup(self, id): - with self.objstore as session: - notification = session.get('notification', str(id)) + global notificationsStore + notification = notificationsStore.get(str(id)) - # use WokMessage to translate the notification - if notification: - timestamp = notification['timestamp'] - plugin = notification.pop('_plugin_name', None) - message = WokMessage(id, notification, plugin).get_text() - return {"code": id, "message": message, "timestamp": timestamp} + # use WokMessage to translate the notification + if notification: + timestamp = notification['timestamp'] + plugin = notification.pop('_plugin_name', None) + message = WokMessage(str(id), notification, plugin).get_text() + return {"code": id, "message": message, "timestamp": timestamp} raise NotFoundError("WOKNOT0001E", {'id': str(id)}) def delete(self, id): + global notificationsStore + try: - with self.objstore as session: - session.delete('notification', str(id)) + del notificationsStore[str(id)] except Exception as e: raise OperationFailed("WOKNOT0002E", {'id': str(id), 'msg': e.msg()}) diff --git a/src/wok/objectstore.py b/src/wok/objectstore.py index ff3796c..59354f3 100644 --- a/src/wok/objectstore.py +++ b/src/wok/objectstore.py @@ -23,8 +23,6 @@ import sqlite3 import threading import traceback -from datetime import datetime - try: from collections import OrderedDict except ImportError: @@ -146,37 +144,3 @@ class ObjectStore(object): # exception again wok_log.error(traceback.format_exc()) return False - - -def add_notification(code, args={}, plugin_name=None): - if not code: - wok_log.error("Unable to add notification: invalid code '%(code)s'" % - {'code': str(code)}) - return - - try: - with ObjectStore() as session: - notification = session.get('notification', code) - except NotFoundError: - notification = None - - try: - # do not update timestamp if notification already exists - timestamp = datetime.now().isoformat() if notification is None else \ - notification['timestamp'] - args.update({"_plugin_name": plugin_name, "timestamp": timestamp}) - - with ObjectStore() as session: - session.store('notification', code, args) - except Exception as e: - wok_log.error("Unable to store notification: %s" % e.message) - - -def clean_notifications(): - try: - with ObjectStore() as session: - notifications = session.get_list('notification') - for item in notifications: - session.delete('notification', item) - except Exception as e: - wok_log.error("Unable to clean notifications: %s" % e.message) diff --git a/src/wok/server.py b/src/wok/server.py index a329ed4..902d4bf 100644 --- a/src/wok/server.py +++ b/src/wok/server.py @@ -33,7 +33,6 @@ from wok.config import config as configParser from wok.config import paths, PluginConfig, WokConfig from wok.control import sub_nodes from wok.model import model -from wok.objectstore import clean_notifications from wok.proxy import start_proxy, terminate_proxy from wok.reqlogger import RequestLogger from wok.root import WokRoot @@ -107,9 +106,6 @@ class Server(object): if dev_env: cherrypy.log.screen = True - # clean object store notifications - clean_notifications() - # close standard file handlers because we are going to use a # watchedfiled handler, otherwise we will have two file handlers # pointing to the same file, duplicating log enries -- 1.9.1