[Kimchi-devel] [PATCH V2] [Wok] Implement Asynchronous Notifications backend

Paulo Ricardo Paz Vital pvital at linux.vnet.ibm.com
Wed Mar 30 19:30:36 UTC 2016


On Mar 30 03:37PM, Lucio Correia wrote:
> On 30-03-2016 11:14, Paulo Ricardo Paz Vital wrote:
> >Few comments and questions...
> >
> >On Mar 29 05:02PM, Lucio Correia wrote:
> >>* There is no POST method: a notification is
> >>added through add_notification() method.
> >>* Notifications are always stored in Wok object store under
> >>'notification' type, even if added by a plugin.
> >>* Every time Wok is started, all notifications are erased,
> >>since this is a UI feature, intended to be showed to the
> >>user asynchronously, independent of which tab is opened.
> >>
> >>Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
> >>---
> >>  docs/API/notifications.md        | 34 ++++++++++++++++++++++++
> >>  src/wok/control/notifications.py | 37 ++++++++++++++++++++++++++
> >>  src/wok/i18n.py                  |  3 +++
> >>  src/wok/model/notifications.py   | 56 ++++++++++++++++++++++++++++++++++++++++
> >>  src/wok/objectstore.py           | 39 ++++++++++++++++++++++++++++
> >>  src/wok/server.py                |  4 +++
> >>  6 files changed, 173 insertions(+)
> >>  create mode 100644 docs/API/notifications.md
> >>  create mode 100644 src/wok/control/notifications.py
> >>  create mode 100644 src/wok/model/notifications.py
> >>
> >>Changes in V2:
> >>  - added timestamp
> >>  - code as required parameter in add_notification
> >>  - added DELETE api for notification
> >>
> >>This patch depends on WokMessage V3 patch
> >>
> >>diff --git a/docs/API/notifications.md b/docs/API/notifications.md
> >
> >Why a new file here? Is it not part of the Kimchi API?
> 
> The API dir have separated files per API.
> 

Ouch! Only now I saw this patch is Wok and not Kimchi :-P

> 
> >
> >>new file mode 100644
> >>index 0000000..851352f
> >>--- /dev/null
> >>+++ b/docs/API/notifications.md
> >>@@ -0,0 +1,34 @@
> >>+## REST API Specification for Notifications
> >>+
> >>+### Collection: Notifications
> >>+
> >>+**URI:** /notifications
> >>+
> >>+**Methods:**
> >>+
> >>+* **GET**: Retrieve a summarized list of current Notifications
> >>+
> >>+#### Examples
> >>+GET /notifications
> >>+[{Notification1}, {Notification2}, ...]
> >>+
> >>+### Resource: Notification
> >>+
> >>+**URI:** /notifications/*:id*
> >>+
> >>+A task represents an asynchronous operation that is being performed by the
> >>+server.
> >>+
> >>+**Methods:**
> >>+
> >>+* **GET**: Retrieve the full description of the Notification
> >>+    * code: message ID
> >>+    * message: message text already translated
> >>+
> >>+#### Examples
> >>+GET /notifications/KCHLIBVIRT0001W
> >>+{
> >>+ id: "KCHLIBVIRT0001W",
> >>+ message: "KCHLIBVIRT0001W: Lack of storage space in guest vm-1",
> >>+ timestamp: first time notification was emitted
> >>+}
> >>diff --git a/src/wok/control/notifications.py b/src/wok/control/notifications.py
> >>new file mode 100644
> >>index 0000000..37d45f2
> >>--- /dev/null
> >>+++ b/src/wok/control/notifications.py
> >>@@ -0,0 +1,37 @@
> >>+#
> >>+# Project Wok
> >>+#
> >>+# Copyright IBM Corp, 2016
> >>+#
> >>+# This library is free software; you can redistribute it and/or
> >>+# modify it under the terms of the GNU Lesser General Public
> >>+# License as published by the Free Software Foundation; either
> >>+# version 2.1 of the License, or (at your option) any later version.
> >>+#
> >>+# This library is distributed in the hope that it will be useful,
> >>+# but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >>+# Lesser General Public License for more details.
> >>+#
> >>+# You should have received a copy of the GNU Lesser General Public
> >>+# 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 wok.control.base import Collection, Resource
> >>+from wok.control.utils import UrlSubNode
> >>+
> >>+
> >>+ at UrlSubNode('notifications', True)
> >>+class Notifications(Collection):
> >>+    def __init__(self, model):
> >>+        super(Notifications, self).__init__(model)
> >>+        self.resource = Notification
> >>+
> >>+
> >>+class Notification(Resource):
> >>+    def __init__(self, model, id):
> >>+        super(Notification, self).__init__(model, id)
> >>+
> >>+    @property
> >>+    def data(self):
> >>+        return self.info
> >>diff --git a/src/wok/i18n.py b/src/wok/i18n.py
> >>index e6087f4..5a2876f 100644
> >>--- a/src/wok/i18n.py
> >>+++ b/src/wok/i18n.py
> >>@@ -45,6 +45,9 @@ messages = {
> >>      "WOKLOG0001E": _("Invalid filter parameter. Filter parameters allowed: %(filters)s"),
> >>      "WOKLOG0002E": _("Creation of log file failed: %(err)s"),
> >>
> >>+    "WOKNOT0001E": _("Unable to find notification %(id)s"),
> >>+    "WOKNOT0002E": _("Unable to delete notification %(id)s: %(message)s"),
> >>+
> >>      "WOKOBJST0001E": _("Unable to find %(item)s in datastore"),
> >>
> >>      "WOKUTILS0001E": _("Unable to reach %(url)s. Make sure it is accessible and try again."),
> >>diff --git a/src/wok/model/notifications.py b/src/wok/model/notifications.py
> >>new file mode 100644
> >>index 0000000..77184db
> >>--- /dev/null
> >>+++ b/src/wok/model/notifications.py
> >>@@ -0,0 +1,56 @@
> >>+#
> >>+# Project Wok
> >>+#
> >>+# Copyright IBM Corp, 2016
> >>+#
> >>+# This library is free software; you can redistribute it and/or
> >>+# modify it under the terms of the GNU Lesser General Public
> >>+# License as published by the Free Software Foundation; either
> >>+# version 2.1 of the License, or (at your option) any later version.
> >>+#
> >>+# This library is distributed in the hope that it will be useful,
> >>+# but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >>+# Lesser General Public License for more details.
> >>+#
> >>+# You should have received a copy of the GNU Lesser General Public
> >>+# 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 wok.exception import NotFoundError, OperationFailed
> >>+from wok.message import WokMessage
> >>+
> >>+
> >>+class NotificationsModel(object):
> >>+    def __init__(self, **kargs):
> >>+        self.objstore = kargs['objstore']
> >>+
> >>+    def get_list(self):
> >>+        with self.objstore as session:
> >>+            return session.get_list('notification')
> >>+
> >>+
> >>+class NotificationModel(object):
> >>+    def __init__(self, **kargs):
> >>+        self.objstore = kargs['objstore']
> >>+
> >>+    def lookup(self, id):
> >>+        with self.objstore as session:
> >>+            notification = session.get('notification', 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}
> >>+
> >>+        raise NotFoundError("WOKNOT0001E", {'id': str(id)})
> >>+
> >>+    def delete(self, id):
> >>+        try:
> >>+            with self.objstore as session:
> >>+                session.delete('notification', 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 59354f3..dbc3ee3 100644
> >>--- a/src/wok/objectstore.py
> >>+++ b/src/wok/objectstore.py
> >>@@ -23,6 +23,8 @@ import sqlite3
> >>  import threading
> >>  import traceback
> >>
> >>+from datetime import datetime
> >>+
> >>  try:
> >>      from collections import OrderedDict
> >>  except ImportError:
> >>@@ -144,3 +146,40 @@ 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: invalide code '%(code)s'" %
> >
> >s/invalide/invalid
> 
> OK will fix.
> 
> 
> -- 
> Lucio Correia
> Software Engineer
> IBM LTC Brazil
> 
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
> 

-- 
Paulo Ricardo Paz Vital
IBM Linux Technology Center
http://www.ibm.com




More information about the Kimchi-devel mailing list