[Kimchi-devel] [PATCH] [Wok] Save notifications in memory instead of object store

Aline Manera alinefm at linux.vnet.ibm.com
Mon May 9 14:57:45 UTC 2016



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 at 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




More information about the Kimchi-devel mailing list