On 05/06/2016 06:09 PM, Lucio Correia wrote:
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(a)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
Should we log notifications events on user log activity?
User log activity is to record any action user took on Wok.
Although the user may close the notification box on UI, it should be
transparent to user and do not impact the system.
@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